diff --git a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt index e4e7f6e83..d9bb8b4f6 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt @@ -5,19 +5,19 @@ import android.content.Intent import android.os.Bundle import android.view.View import androidx.fragment.app.activityViewModels -import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.R import io.legado.app.base.VMBaseFragment import io.legado.app.data.appDb import io.legado.app.data.entities.Bookmark import io.legado.app.databinding.FragmentBookmarkBinding import io.legado.app.lib.theme.primaryColor +import io.legado.app.ui.widget.recycler.UpLinearLayoutManager import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -27,19 +27,22 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_bookmark TocViewModel.BookmarkCallBack { override val viewModel by activityViewModels() private val binding by viewBinding(FragmentBookmarkBinding::bind) + private val mLayoutManager by lazy { UpLinearLayoutManager(requireContext()) } private val adapter by lazy { BookmarkAdapter(requireContext(), this) } + private var durChapterIndex = 0 override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { viewModel.bookMarkCallBack = this initRecyclerView() viewModel.bookData.observe(this) { + durChapterIndex = it.durChapterIndex upBookmark(null) } } private fun initRecyclerView() { binding.recyclerView.setEdgeEffectColor(primaryColor) - binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) + binding.recyclerView.layoutManager = mLayoutManager binding.recyclerView.addItemDecoration(VerticalDivider(requireContext())) binding.recyclerView.adapter = adapter } @@ -54,7 +57,16 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_bookmark } }.let { adapter.setItems(it) - delay(100) + var scrollPos = 0 + withContext(Dispatchers.Default) { + adapter.getItems().forEachIndexed { index, bookmark -> + if (bookmark.chapterIndex >= durChapterIndex) { + return@withContext + } + scrollPos = index + } + } + mLayoutManager.scrollToPositionWithOffset(scrollPos, 0) } } } 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 9a75b9308..871c68c41 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 @@ -63,6 +63,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) : override fun onCurrentListChanged() { super.onCurrentListChanged() upDisplayTile() + callback.onListChanged() } fun upDisplayTile() { @@ -157,6 +158,7 @@ class ChapterListAdapter(context: Context, val callback: Callback) : val isLocalBook: Boolean fun openChapter(bookChapter: BookChapter) fun durChapterIndex(): Int + fun onListChanged() } } \ No newline at end of file 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 8eeb80004..35355f534 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 @@ -22,6 +22,7 @@ import io.legado.app.utils.ColorUtils import io.legado.app.utils.observeEvent import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers.Default import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch @@ -111,10 +112,22 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt } }.let { adapter.setItems(it) - if (searchKey.isNullOrBlank() && mLayoutManager.findFirstVisibleItemPosition() < 0) { - mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) + } + } + } + + override fun onListChanged() { + launch { + var scrollPos = 0 + withContext(Default) { + adapter.getItems().forEachIndexed { index, bookChapter -> + if (bookChapter.index >= durChapterIndex) { + return@withContext + } + scrollPos = index } } + mLayoutManager.scrollToPositionWithOffset(scrollPos, 0) } }