diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt index 1fed76755..ddde45ec1 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt @@ -8,6 +8,7 @@ import android.view.View.VISIBLE import androidx.appcompat.widget.SearchView import androidx.lifecycle.LiveData import androidx.lifecycle.Observer +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.legado.app.App @@ -15,6 +16,7 @@ import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.PreferKey import io.legado.app.data.entities.Book +import io.legado.app.data.entities.SearchBook import io.legado.app.data.entities.SearchKeyword import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.primaryTextColor @@ -40,7 +42,7 @@ class SearchActivity : VMBaseActivity(R.layout.activity_book_se override val viewModel: SearchViewModel get() = getViewModel(SearchViewModel::class.java) - override lateinit var adapter: SearchAdapter + lateinit var adapter: SearchAdapter private lateinit var bookAdapter: BookAdapter private lateinit var historyKeyAdapter: HistoryKeyAdapter private lateinit var loadMoreView: LoadMoreView @@ -176,6 +178,9 @@ class SearchActivity : VMBaseActivity(R.layout.activity_book_se } upGroupMenu() }) + viewModel.searchBookLiveData.observe(this, Observer { + setSearchItems(it) + }) } private fun initIntent() { @@ -251,9 +256,14 @@ class SearchActivity : VMBaseActivity(R.layout.activity_book_se }) } + private fun setSearchItems(items: List) { + val diffResult = DiffUtil.calculateDiff(DiffCallBack(adapter.getItems(), items)) + adapter.setItems(items, false) + diffResult.dispatchUpdatesTo(adapter) + } + override fun startSearch() { refresh_progress_bar.isAutoLoading = true - initData() fb_stop.visible() } diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt index 1d0ff163a..2205f78fd 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt @@ -1,6 +1,7 @@ package io.legado.app.ui.book.search import android.app.Application +import androidx.lifecycle.MutableLiveData import io.legado.app.App import io.legado.app.base.BaseViewModel import io.legado.app.constant.PreferKey @@ -12,7 +13,6 @@ import io.legado.app.model.WebBook import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.getPrefString import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.withContext import java.util.concurrent.Executors @@ -22,6 +22,7 @@ class SearchViewModel(application: Application) : BaseViewModel(application) { Executors.newFixedThreadPool(AppConfig.threadCount).asCoroutineDispatcher() private var task: Coroutine<*>? = null var callBack: CallBack? = null + var searchBookLiveData = MutableLiveData>() var searchKey: String = "" var searchPage = 1 var isLoading = false @@ -83,12 +84,12 @@ class SearchViewModel(application: Application) : BaseViewModel(application) { books.add(searchBook) } App.db.searchBookDao().insert(*books.toTypedArray()) - addToAdapter(books) + mergeItems(books) } } @Synchronized - private suspend fun addToAdapter(newDataS: List) { + private fun mergeItems(newDataS: List) { if (newDataS.isNotEmpty()) { val copyDataS = ArrayList(searchBooks) val searchBooksAdd = ArrayList() @@ -134,10 +135,8 @@ class SearchViewModel(application: Application) : BaseViewModel(application) { } } } - withContext(Main) { - searchBooks = copyDataS - callBack?.adapter?.setItems(searchBooks) - } + searchBooks = copyDataS + searchBookLiveData.postValue(copyDataS) } } @@ -173,7 +172,6 @@ class SearchViewModel(application: Application) : BaseViewModel(application) { } interface CallBack { - var adapter: SearchAdapter fun startSearch() fun searchFinally() }