我正在尝试创建一个回收器视图,其中显示了 pdf 文件的文件名和 pdf 图标,但我无法这样做,我是 kotlin 的新手,我正在学习如何实现它,适用于 android 11 upwards.
这是我的代码 我的 Document.kt 类
`package com.example.securityapps
import PDFADAPTER
import android.Manifest
import android.R.attr.mimeType
import android.content.ContentUris
import android.content.pm.PackageManager
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.load.engine.executor.GlideExecutor.UncaughtThrowableStrategy.LOG
import com.loopj.android.http.AsyncHttpClient.log
import java.io.File
class Documents : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
//declare a variable for Transfer button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_documents)
Log.println(Log.DEBUG,"this","Hello")
// find Transfer button by id
recyclerView = findViewById(R.id.recycler_view_pdf)
recyclerView.layoutManager = GridLayoutManager(this, DOCUMENT_COLUMN_COUNT)
// Check if permission is granted
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
// Request permission if not granted
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
READ_EXTERNAL_STORAGE_REQUEST_CODE
)
} else {
// Permission granted, load documents from gallery
val documentPathList = getDocumentsFromDownloads()
Log.println(Log.VERBOSE ,"moon",documentPathList.toString())
val adapter = PDFADAPTER()
adapter.PdfConvertor(this, documentPathList.map { File(it) })
recyclerView.adapter = adapter
recyclerView.adapter = adapter
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == READ_EXTERNAL_STORAGE_REQUEST_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission granted, load documents from gallery
val documentPathList = getDocumentsFromDownloads()
val adapter = PDFADAPTER()
adapter.PdfConvertor(this, documentPathList.map { File(it) })
recyclerView.adapter = adapter
recyclerView.adapter = adapter
Log.println(Log.DEBUG,"this_is_not_working",documentPathList.toString())
// Set visibility of Transfer button if at least one document is checked
} else {
// Permission denied
// Show an error message or do nothing
Log.println(Log.DEBUG,"permission","permission denied");
}
}
}
private fun getDocumentsFromDownloads(): List<String> {
val documentList = mutableListOf<String>()
val projection = arrayOf(
MediaStore.Downloads._ID,
MediaStore.Downloads.DISPLAY_NAME,
MediaStore.Downloads.DATE_ADDED,
MediaStore.Downloads.SIZE,
MediaStore.Downloads.RELATIVE_PATH
)
val selection = "${MediaStore.Downloads.MIME_TYPE} = ? AND ${MediaStore.Downloads.RELATIVE_PATH} LIKE ?"
val selectionArgs = arrayOf("application/pdf", "%Download%")
val cursor: Cursor? = contentResolver.query(
MediaStore.Downloads.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
null
)
cursor?.use {
val idCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads._ID)
val nameCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.DISPLAY_NAME)
val addedCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.DATE_ADDED)
val sizeCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.SIZE)
val pathCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.RELATIVE_PATH)
while (cursor.moveToNext()) {
val fileId = cursor.getLong(idCol)
val fileUri: Uri = ContentUris.withAppendedId(MediaStore.Downloads.EXTERNAL_CONTENT_URI, fileId)
val fileName = cursor.getString(nameCol)
val dateAdded = cursor.getLong(addedCol)
val size = cursor.getLong(sizeCol)
val relativePath = cursor.getString(pathCol)
val fullPath = "${Environment.getExternalStorageDirectory().path}/$relativePath/$fileName"
documentList.add(fullPath)
}
}
return documentList
}
companion object
{
private const val DOCUMENT_COLUMN_COUNT = 2
private const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1000;
}
}`
我的 PdfAdapter.kt 类 `
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.CheckBox
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.example.securityapps.R
import com.example.securityapps.Recycler_Adapter
import java.io.File
class PDFADAPTER() :
RecyclerView.Adapter<PDFADAPTER.ViewHolder>() {
private var context: Context? = null
private lateinit var pdfFiles: List<File>
fun PdfConvertor(context: Context, pdfFiles: List<File>) {
this.context = context
this.pdfFiles = pdfFiles
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val pdfCardView: CardView = itemView.findViewById(R.id.pdf_cardView)
val pdfImage: ImageView = itemView.findViewById(R.id.pdf_image)
val pdfName: TextView = itemView.findViewById(R.id.pdf_name)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.activity_documents, parent, false)
return ViewHolder(view)
}
override fun getItemCount(): Int {
return pdfFiles.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val pdfFile = pdfFiles[position]
holder.pdfName.text = pdfFile.nameWithoutExtension
holder.pdfCardView.setOnClickListener {
// TODO: handle click event
}
}
}
` 和 pdf_card_view.xml
`<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_marginTop="8dp"
android:id="@+id/pdf_cardView"
android:layout_marginStart="8dp"
app:cardElevation="8dp"
app:cardCornerRadius="8dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="vertical"
android:padding="8dp"
android:id="@+id/linear_Pdf"
>
<ImageView
android:id="@+id/pdf_image"
android:layout_width="299dp"
android:layout_height="133dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:src="@drawable/pdf_icons" />
<TextView
android:id="@+id/pdf_name"
android:layout_width="384dp"
android:layout_height="56dp"
android:layout_marginStart="5dp"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:padding="6dp"
android:scrollHorizontally="true"
android:text="hello"
android:textColor="@color/black"
android:textSize="20dp" />
</LinearLayout>
</androidx.cardview.widget.CardView>`
和 activity.xml 文件
`<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_pdf"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp" />
<Button
android:id="@+id/airdrop_button"
android:layout_width="406dp"
android:layout_height="98dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_gravity="end|bottom"
android:layout_marginStart="3dp"
android:layout_marginTop="572dp"
android:layout_marginEnd="2dp"
android:layout_marginBottom="61dp"
android:clipChildren="false"
android:clipToPadding="false"
android:text="@string/transfer" />
</RelativeLayout>