diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt index aeb38b2bc..08ca15e13 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt @@ -6,14 +6,19 @@ import androidx.recyclerview.widget.DiffUtil import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.databinding.ItemChapterListBinding +import io.legado.app.help.AppConfig +import io.legado.app.help.ContentProcessor import io.legado.app.lib.theme.ThemeUtils import io.legado.app.lib.theme.accentColor import io.legado.app.utils.getCompatColor import io.legado.app.utils.gone import io.legado.app.utils.visible import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.launch class ChapterListAdapter(context: Context, val callback: Callback) : RecyclerAdapter(context) { @@ -44,6 +49,25 @@ class ChapterListAdapter(context: Context, val callback: Callback) : } + private val replaceRules + get() = callback.book?.let { + ContentProcessor.get(it.name, it.origin).getReplaceRules() + } + private val useReplace + get() = AppConfig.tocUiUseReplace && callback.book?.getUseReplaceRule() == true + + fun upDisplayTile() { + callback.scope.launch(IO) { + val replaceRules = replaceRules + val useReplace = useReplace + getItems().forEach { + if (displayTileMap[it.index] == null) { + displayTileMap[it.index] = it.getDisplayTitle(replaceRules, useReplace) + } + } + } + } + override fun getViewBinding(parent: ViewGroup): ItemChapterListBinding { return ItemChapterListBinding.inflate(inflater, parent, false) } @@ -53,7 +77,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) : if (displayTile != null) { return displayTile } - displayTile = chapter.getDisplayTitle() + displayTile = chapter.getDisplayTitle(replaceRules, useReplace) displayTileMap[chapter.index] = displayTile return displayTile } @@ -116,6 +140,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) : interface Callback { val scope: CoroutineScope + val book: Book? val isLocalBook: Boolean fun openChapter(bookChapter: BookChapter) fun durChapterIndex(): Int diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 47438ef6c..985f61aff 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -113,6 +113,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt }.collect { if (!(searchKey.isNullOrBlank() && it.isEmpty())) { adapter.setItems(it, adapter.diffCallBack) + adapter.upDisplayTile() if (searchKey.isNullOrBlank() && mLayoutManager.findFirstVisibleItemPosition() < 0) { mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) } @@ -123,11 +124,15 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt override fun clearDisplayTitle() { adapter.displayTileMap.clear() + adapter.upDisplayTile() } override val scope: CoroutineScope get() = this + override val book: Book? + get() = viewModel.bookData.value + override val isLocalBook: Boolean get() = viewModel.bookData.value?.isLocalBook() == true