pull/1693/head
kunfei 3 years ago
parent 417c1c28a0
commit 7e97e60b58
  1. 32
      app/src/main/java/io/legado/app/ui/book/toc/ChapterListAdapter.kt
  2. 9
      app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt

@ -4,8 +4,8 @@ import android.content.Context
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import io.legado.app.R
import io.legado.app.base.adapter.DiffRecyclerAdapter
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
@ -22,21 +22,23 @@ import kotlinx.coroutines.isActive
import java.util.concurrent.ConcurrentHashMap
class ChapterListAdapter(context: Context, val callback: Callback) :
RecyclerAdapter<BookChapter, ItemChapterListBinding>(context) {
DiffRecyclerAdapter<BookChapter, ItemChapterListBinding>(context) {
val cacheFileNames = hashSetOf<String>()
val displayTileMap = ConcurrentHashMap<Int, String>()
val diffCallBack = object : DiffUtil.ItemCallback<BookChapter>() {
override fun areItemsTheSame(
oldItem: BookChapter,
newItem: BookChapter
): Boolean {
return oldItem.index == newItem.index
}
override val diffItemCallback: DiffUtil.ItemCallback<BookChapter>
get() = object : DiffUtil.ItemCallback<BookChapter>() {
override fun areItemsTheSame(
oldItem: BookChapter,
newItem: BookChapter
): Boolean {
return oldItem.index == newItem.index
}
override fun areContentsTheSame(
oldItem: BookChapter,
override fun areContentsTheSame(
oldItem: BookChapter,
newItem: BookChapter
): Boolean {
return oldItem.bookUrl == newItem.bookUrl
@ -48,7 +50,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) :
&& oldItem.isVolume == newItem.isVolume
}
}
}
private val replaceRules
get() = callback.book?.let {
@ -58,6 +60,11 @@ class ChapterListAdapter(context: Context, val callback: Callback) :
get() = AppConfig.tocUiUseReplace && callback.book?.getUseReplaceRule() == true
private var upDisplayTileJob: Coroutine<*>? = null
override fun onCurrentListChanged() {
super.onCurrentListChanged()
upDisplayTile()
}
fun upDisplayTile() {
upDisplayTileJob?.cancel()
upDisplayTileJob = Coroutine.async(callback.scope) {
@ -151,4 +158,5 @@ class ChapterListAdapter(context: Context, val callback: Callback) :
fun openChapter(bookChapter: BookChapter)
fun durChapterIndex(): Int
}
}

@ -109,12 +109,9 @@ class ChapterListFragment : VMBaseFragment<TocViewModel>(R.layout.fragment_chapt
searchKey.isNullOrBlank() -> appDb.bookChapterDao.flowByBook(viewModel.bookUrl)
else -> appDb.bookChapterDao.flowSearch(viewModel.bookUrl, searchKey)
}.conflate().collect {
if (!(searchKey.isNullOrBlank() && it.isEmpty())) {
adapter.setItems(it, adapter.diffCallBack)
adapter.upDisplayTile()
if (searchKey.isNullOrBlank() && mLayoutManager.findFirstVisibleItemPosition() < 0) {
mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0)
}
adapter.setItems(it)
if (searchKey.isNullOrBlank() && mLayoutManager.findFirstVisibleItemPosition() < 0) {
mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0)
}
delay(100)
}

Loading…
Cancel
Save