From 9dfa05ef977c1a82af5951b55fbd09087fd7da37 Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Thu, 25 Sep 2025 10:34:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=BA=E5=88=AB=E6=90=9C=E7=B4=A2=E7=9A=84ad?= =?UTF-8?q?apter=E3=80=82=E6=90=9C=E7=B4=A2=E4=BC=9A=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E9=AB=98=E4=BA=AE=EF=BC=8C=E5=B9=B6=E4=B8=94=E4=BD=BF=E7=94=A8?= =?UTF-8?q?PdfDiffCallback=EF=BC=8C=E5=9B=A0=E4=B8=BA=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E4=BC=9A=E9=A2=91=E7=B9=81=E7=9A=84=E5=88=B7=E6=96=B0=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pro/app/ui/act/PdfViewActivity.kt | 31 ------- .../pro/app/ui/act/SearchActivity.kt | 5 +- .../pro/app/ui/adapter/PdfAdapter.kt | 70 +++++--------- .../pro/app/ui/adapter/SearchPdfAdapter.kt | 91 +++++++++++++++++++ .../app/ui/dialog/BookmarksDialogFragment.kt | 1 + .../ui/dialog/FileDetailsDialogFragment.kt | 1 + .../app/ui/dialog/ListMoreDialogFragment.kt | 1 + .../pro/app/ui/dialog/PdfSetPasswordDialog.kt | 1 + .../pro/app/ui/dialog/PromptDialogFragment.kt | 1 + .../pro/app/ui/dialog/RenameDialogFragment.kt | 1 + .../app/ui/dialog/ViewModelDialogFragment.kt | 1 + .../pro/app/ui/fragment/FavoriteFrag.kt | 2 +- .../pdfreader/pro/app/ui/fragment/HomeFrag.kt | 2 +- .../pro/app/ui/fragment/RecentlyFrag.kt | 2 +- 14 files changed, 126 insertions(+), 84 deletions(-) create mode 100644 app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/SearchPdfAdapter.kt diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt index bf2ae74..5bf057a 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/PdfViewActivity.kt @@ -73,11 +73,6 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList viewModel.pdfDocument.observe(this) { document -> document?.let { pdfDocument = it - // 只有文件路径变化才重新加载 PDF -// if (lastLoadedFilePath != pdfDocument.filePath) { -// lastLoadedFilePath = pdfDocument.filePath -// loadPdf() -// } loadPdf() initView() } ?: run { @@ -113,32 +108,6 @@ class PdfViewActivity : BaseActivity(), OnLoadCompleteListener, OnPageChangeList showToast(getString(R.string.bookmark_add_fail)) } } - -// viewModel.fileActionEvent.observeEvent(this) { event -> -// if (event.renameResult.success) { -// showToast(getString(R.string.rename_successfully)) -// event.renameResult.newFilePath?.let { -// //修改名称需要重新load界面,因为路径都更改了 -// viewModel.getPDFDocument(it) -// } -// } else { -// showToast(event.renameResult.errorMessage.toString()) -// } -// } -// viewModel.fileActionEvent.observeEvent(this) { event -> -// if (event.file != null) { -// showToast(getString(R.string.duplicate_created_successfully)) -// } else { -// showToast(getString(R.string.duplicate_created_failed)) -// } -// } -// viewModel.fileActionEvent.observeEvent(this) { event -> -// if (event.isFavorite) { -// showToast(getString(R.string.added_to_favorites)) -// } else { -// showToast(getString(R.string.removed_from_favorites)) -// } -// } } private fun initView() { diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt index 7fc7607..3edf93c 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/act/SearchActivity.kt @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.databinding.ActivitySearchPddBinding import com.all.pdfreader.pro.app.ui.adapter.PdfAdapter +import com.all.pdfreader.pro.app.ui.adapter.SearchPdfAdapter import com.all.pdfreader.pro.app.ui.dialog.ListMoreDialogFragment import com.all.pdfreader.pro.app.util.AppUtils.showKeyboard import com.gyf.immersionbar.ImmersionBar @@ -32,7 +33,7 @@ class SearchActivity : BaseActivity() { } private lateinit var binding: ActivitySearchPddBinding - private lateinit var adapter: PdfAdapter + private lateinit var adapter: SearchPdfAdapter private val pdfRepository = getRepository() private var searchJob: Job? = null @@ -92,7 +93,7 @@ class SearchActivity : BaseActivity() { private fun initView() { binding.searchEdit.showKeyboard() - adapter = PdfAdapter(onItemClick = { pdf -> + adapter = SearchPdfAdapter(onItemClick = { pdf -> val intent = PdfViewActivity.createIntent(this, pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt index 7137378..c62ad0f 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/PdfAdapter.kt @@ -4,88 +4,62 @@ import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.databinding.AdapterPdfItemBinding import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.util.AppUtils.dpToPx -import com.all.pdfreader.pro.app.util.AppUtils.toHighlightedSpannable import com.all.pdfreader.pro.app.util.FileUtils.toFormatFileSize import com.all.pdfreader.pro.app.util.FileUtils.toSlashDate -import com.all.pdfreader.pro.app.util.PdfDiffCallback import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners class PdfAdapter( + private var pdfList: MutableList, private val onItemClick: (PdfDocumentEntity) -> Unit, private val onMoreClick: (PdfDocumentEntity) -> Unit -) : ListAdapter(PdfDiffCallback()) { +) : RecyclerView.Adapter() { inner class PdfViewHolder(val binding: AdapterPdfItemBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PdfViewHolder { - val binding = AdapterPdfItemBinding.inflate( - LayoutInflater.from(parent.context), parent, false - ) + val binding = + AdapterPdfItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) return PdfViewHolder(binding) } @SuppressLint("SetTextI18n") override fun onBindViewHolder(holder: PdfViewHolder, position: Int) { - bindItem(holder, getItem(position), null) - } - - override fun onBindViewHolder(holder: PdfViewHolder, position: Int, payloads: MutableList) { - if (payloads.isNotEmpty()) { - val payload = payloads[0] as? String - bindItem(holder, getItem(position), payload) - } else { - super.onBindViewHolder(holder, position, payloads) - } - } - - private fun bindItem(holder: PdfViewHolder, item: PdfDocumentEntity, highlightKeyword: String?) { - val context = holder.binding.root.context - - // 文件名高亮,如果 highlightKeyword 为 null 或空字符串,就显示普通文本 - holder.binding.tvFileName.text = if (highlightKeyword.isNullOrBlank()) { - item.fileName - } else { - item.fileName.toHighlightedSpannable(highlightKeyword, holder.binding.root.context.getColor(R.color.icon_sel_on_color)) - } - + val item = pdfList[position] + holder.binding.tvFileName.text = item.fileName holder.binding.tvFileSize.text = item.fileSize.toFormatFileSize() holder.binding.tvFileDate.text = item.lastModified.toSlashDate() - if (item.isPassword) { holder.binding.lockLayout.visibility = View.VISIBLE holder.binding.tvFileImg.visibility = View.GONE } else { holder.binding.lockLayout.visibility = View.GONE holder.binding.tvFileImg.visibility = View.VISIBLE - Glide.with(context) - .load(item.thumbnailPath) - .transform(CenterCrop(), RoundedCorners(8.dpToPx(context))) + Glide.with(holder.binding.root).load(item.thumbnailPath) + .transform(CenterCrop(), RoundedCorners(8.dpToPx(holder.binding.root.context))) .into(holder.binding.tvFileImg) } - holder.binding.root.setOnClickListener { onItemClick(item) } - holder.binding.moreBtn.setOnClickListener { onMoreClick(item) } - } - - fun updateData(newList: List) { - submitList(newList.toList()) - } - - /** - * 搜索场景使用:只刷新高亮,不刷新整个列表 - */ - fun highlightItems(keyword: String) { - for (i in 0 until itemCount) { - notifyItemChanged(i, keyword) + holder.binding.root.setOnClickListener { + onItemClick(item) + } + holder.binding.moreBtn.setOnClickListener { + onMoreClick(item) } } + + override fun getItemCount(): Int = pdfList.size + + @SuppressLint("NotifyDataSetChanged") + fun updateData(newList: List) { + pdfList.clear() + pdfList.addAll(newList) + notifyDataSetChanged() + } } diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/SearchPdfAdapter.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/SearchPdfAdapter.kt new file mode 100644 index 0000000..ca5ea06 --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/adapter/SearchPdfAdapter.kt @@ -0,0 +1,91 @@ +package com.all.pdfreader.pro.app.ui.adapter + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.all.pdfreader.pro.app.R +import com.all.pdfreader.pro.app.databinding.AdapterPdfItemBinding +import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity +import com.all.pdfreader.pro.app.util.AppUtils.dpToPx +import com.all.pdfreader.pro.app.util.AppUtils.toHighlightedSpannable +import com.all.pdfreader.pro.app.util.FileUtils.toFormatFileSize +import com.all.pdfreader.pro.app.util.FileUtils.toSlashDate +import com.all.pdfreader.pro.app.util.PdfDiffCallback +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners + +class SearchPdfAdapter( + private val onItemClick: (PdfDocumentEntity) -> Unit, + private val onMoreClick: (PdfDocumentEntity) -> Unit +) : ListAdapter(PdfDiffCallback()) { + + inner class PdfViewHolder(val binding: AdapterPdfItemBinding) : + RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PdfViewHolder { + val binding = AdapterPdfItemBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ) + return PdfViewHolder(binding) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: PdfViewHolder, position: Int) { + bindItem(holder, getItem(position), null) + } + + override fun onBindViewHolder(holder: PdfViewHolder, position: Int, payloads: MutableList) { + if (payloads.isNotEmpty()) { + val payload = payloads[0] as? String + bindItem(holder, getItem(position), payload) + } else { + super.onBindViewHolder(holder, position, payloads) + } + } + + private fun bindItem(holder: PdfViewHolder, item: PdfDocumentEntity, highlightKeyword: String?) { + val context = holder.binding.root.context + + // 文件名高亮,如果 highlightKeyword 为 null 或空字符串,就显示普通文本 + holder.binding.tvFileName.text = if (highlightKeyword.isNullOrBlank()) { + item.fileName + } else { + item.fileName.toHighlightedSpannable(highlightKeyword, holder.binding.root.context.getColor(R.color.icon_sel_on_color)) + } + + holder.binding.tvFileSize.text = item.fileSize.toFormatFileSize() + holder.binding.tvFileDate.text = item.lastModified.toSlashDate() + + if (item.isPassword) { + holder.binding.lockLayout.visibility = View.VISIBLE + holder.binding.tvFileImg.visibility = View.GONE + } else { + holder.binding.lockLayout.visibility = View.GONE + holder.binding.tvFileImg.visibility = View.VISIBLE + Glide.with(context) + .load(item.thumbnailPath) + .transform(CenterCrop(), RoundedCorners(8.dpToPx(context))) + .into(holder.binding.tvFileImg) + } + + holder.binding.root.setOnClickListener { onItemClick(item) } + holder.binding.moreBtn.setOnClickListener { onMoreClick(item) } + } + + fun updateData(newList: List) { + submitList(newList.toList()) + } + + /** + * 搜索场景使用:只刷新高亮,不刷新整个列表 + */ + fun highlightItems(keyword: String) { + for (i in 0 until itemCount) { + notifyItemChanged(i, keyword) + } + } +} diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/BookmarksDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/BookmarksDialogFragment.kt index d16af0c..eb11c9b 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/BookmarksDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/BookmarksDialogFragment.kt @@ -13,6 +13,7 @@ import com.all.pdfreader.pro.app.model.RenameType import com.all.pdfreader.pro.app.room.entity.BookmarkEntity import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.ui.adapter.BookmarkAdapter +import com.all.pdfreader.pro.app.util.ToastUtils import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import com.google.android.material.bottomsheet.BottomSheetDialogFragment diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/FileDetailsDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/FileDetailsDialogFragment.kt index 554b059..991fa7a 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/FileDetailsDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/FileDetailsDialogFragment.kt @@ -11,6 +11,7 @@ import com.all.pdfreader.pro.app.databinding.DialogFileDetailsBinding import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.util.FileUtils.toFormatFileSize import com.all.pdfreader.pro.app.util.FileUtils.toSlashDateTime +import com.all.pdfreader.pro.app.util.ToastUtils import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import com.google.android.material.bottomsheet.BottomSheetDialogFragment diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt index 6e268aa..91618a4 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ListMoreDialogFragment.kt @@ -24,6 +24,7 @@ import com.all.pdfreader.pro.app.util.AppUtils.setClickWithAnimation import com.all.pdfreader.pro.app.util.AppUtils.shareFile import com.all.pdfreader.pro.app.util.FileUtils.toFormatFileSize import com.all.pdfreader.pro.app.util.FileUtils.toSlashDate +import com.all.pdfreader.pro.app.util.ToastUtils import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CenterCrop diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PdfSetPasswordDialog.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PdfSetPasswordDialog.kt index 89443fb..ed53bb2 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PdfSetPasswordDialog.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PdfSetPasswordDialog.kt @@ -15,6 +15,7 @@ import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.databinding.DialogPdfSetPasswordBinding import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.util.AppUtils.showKeyboard +import com.all.pdfreader.pro.app.util.ToastUtils import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import kotlin.getValue diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PromptDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PromptDialogFragment.kt index 8209b31..6319a3b 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PromptDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/PromptDialogFragment.kt @@ -10,6 +10,7 @@ import androidx.core.graphics.drawable.toDrawable import androidx.fragment.app.DialogFragment import com.all.pdfreader.pro.app.R import com.all.pdfreader.pro.app.databinding.DialogDeleteBinding +import com.all.pdfreader.pro.app.util.ToastUtils class PromptDialogFragment( private val title: String, diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/RenameDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/RenameDialogFragment.kt index 3e29b3b..e2c8bc9 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/RenameDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/RenameDialogFragment.kt @@ -17,6 +17,7 @@ import com.all.pdfreader.pro.app.model.RenameType import com.all.pdfreader.pro.app.room.entity.BookmarkEntity import com.all.pdfreader.pro.app.util.AppUtils.showKeyboard import com.all.pdfreader.pro.app.util.FileUtils +import com.all.pdfreader.pro.app.util.ToastUtils import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import java.io.File diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt index 5f04578..f5cf851 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/dialog/ViewModelDialogFragment.kt @@ -17,6 +17,7 @@ import com.all.pdfreader.pro.app.room.entity.PdfDocumentEntity import com.all.pdfreader.pro.app.sp.AppStore import com.all.pdfreader.pro.app.ui.view.CustomSwitchButton import com.all.pdfreader.pro.app.ui.view.CustomSwitchButton.OnCheckedChangeListener +import com.all.pdfreader.pro.app.util.ToastUtils import com.all.pdfreader.pro.app.viewmodel.PdfViewModel import com.google.android.material.bottomsheet.BottomSheetDialogFragment diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt index c07e28a..462bf5e 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/FavoriteFrag.kt @@ -40,7 +40,7 @@ class FavoriteFrag : BaseFrag() { } private fun initView() { - adapter = PdfAdapter(onItemClick = { pdf -> + adapter = PdfAdapter(pdfList = mutableListOf(),onItemClick = { pdf -> val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt index 5a6fa34..7f1145c 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/HomeFrag.kt @@ -42,7 +42,7 @@ class HomeFrag : BaseFrag(), MainActivity.SortableFragment { } private fun initView() { - adapter = PdfAdapter(onItemClick = { pdf -> + adapter = PdfAdapter(pdfList = mutableListOf(), onItemClick = { pdf -> val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf -> diff --git a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt index 52dc1da..c7e11d2 100644 --- a/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt +++ b/app/src/main/java/com/all/pdfreader/pro/app/ui/fragment/RecentlyFrag.kt @@ -39,7 +39,7 @@ class RecentlyFrag : BaseFrag() { } private fun initView() { - adapter = PdfAdapter(onItemClick = { pdf -> + adapter = PdfAdapter(pdfList = mutableListOf(),onItemClick = { pdf -> val intent = PdfViewActivity.createIntent(requireContext(), pdf.filePath) startActivity(intent) }, onMoreClick = { pdf ->