diff --git a/app/src/main/java/io/legado/app/data/dao/BookChapterDao.kt b/app/src/main/java/io/legado/app/data/dao/BookChapterDao.kt index 6e5d7e399..4b60bb8b3 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookChapterDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookChapterDao.kt @@ -2,16 +2,12 @@ package io.legado.app.data.dao import androidx.room.* import io.legado.app.data.entities.BookChapter -import kotlinx.coroutines.flow.Flow @Dao interface BookChapterDao { - @Query("select * from chapters where bookUrl = :bookUrl order by `index`") - fun flowByBook(bookUrl: String): Flow> - @Query("SELECT * FROM chapters where bookUrl = :bookUrl and title like '%'||:key||'%' order by `index`") - fun flowSearch(bookUrl: String, key: String): Flow> + fun search(bookUrl: String, key: String): List @Query("select * from chapters where bookUrl = :bookUrl order by `index`") fun getChapterList(bookUrl: String): List 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 18f34c0d7..8eeb80004 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 @@ -21,10 +21,11 @@ import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.ColorUtils import io.legado.app.utils.observeEvent import io.legado.app.utils.viewbindingdelegate.viewBinding -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main -import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapter_list), ChapterListAdapter.Callback, @@ -34,10 +35,9 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt private val mLayoutManager by lazy { UpLinearLayoutManager(requireContext()) } private val adapter by lazy { ChapterListAdapter(requireContext(), this) } private var durChapterIndex = 0 - private var tocFlowJob: Job? = null override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = binding.run { - viewModel.chapterCallBack = this@ChapterListFragment + viewModel.chapterListCallBack = this@ChapterListFragment val bbg = bottomBackground val btc = requireContext().getPrimaryTextColor(ColorUtils.isColorLight(bbg)) llChapterBaseInfo.setBackgroundColor(bbg) @@ -103,17 +103,17 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt } override fun upChapterList(searchKey: String?) { - tocFlowJob?.cancel() - tocFlowJob = launch { - when { - searchKey.isNullOrBlank() -> appDb.bookChapterDao.flowByBook(viewModel.bookUrl) - else -> appDb.bookChapterDao.flowSearch(viewModel.bookUrl, searchKey) - }.conflate().collect { + launch { + withContext(IO) { + when { + searchKey.isNullOrBlank() -> appDb.bookChapterDao.getChapterList(viewModel.bookUrl) + else -> appDb.bookChapterDao.search(viewModel.bookUrl, searchKey) + } + }.let { adapter.setItems(it) if (searchKey.isNullOrBlank() && mLayoutManager.findFirstVisibleItemPosition() < 0) { mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) } - delay(100) } } } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt index d0fb06dfa..e937a3176 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt @@ -83,6 +83,7 @@ class TocActivity : VMBaseActivity() { override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_reverse_toc -> viewModel.reverseToc { + viewModel.chapterListCallBack?.upChapterList(searchView?.query?.toString()) setResult(RESULT_OK, Intent().apply { putExtra("index", it.durChapterIndex) putExtra("chapterPos", 0) @@ -90,7 +91,7 @@ class TocActivity : VMBaseActivity() { } R.id.menu_use_replace -> { AppConfig.tocUiUseReplace = !item.isChecked - viewModel.chapterCallBack?.clearDisplayTitle() + viewModel.chapterListCallBack?.clearDisplayTitle() } R.id.menu_log -> showDialogFragment() } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt index fe3e76323..b766fad2a 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocViewModel.kt @@ -10,7 +10,7 @@ import io.legado.app.data.entities.Book class TocViewModel(application: Application) : BaseViewModel(application) { var bookUrl: String = "" var bookData = MutableLiveData() - var chapterCallBack: ChapterListCallBack? = null + var chapterListCallBack: ChapterListCallBack? = null var bookMarkCallBack: BookmarkCallBack? = null fun initBook(bookUrl: String) { @@ -39,7 +39,7 @@ class TocViewModel(application: Application) : BaseViewModel(application) { } fun startChapterListSearch(newText: String?) { - chapterCallBack?.upChapterList(newText) + chapterListCallBack?.upChapterList(newText) } fun startBookmarkSearch(newText: String?) {