diff --git a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt index d45502c28..4a9a353db 100644 --- a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt @@ -107,7 +107,11 @@ abstract class RecyclerAdapter(protected val context: Co } @Synchronized - fun setItems(items: List?, itemCallback: DiffUtil.ItemCallback) { + fun setItems( + items: List?, + itemCallback: DiffUtil.ItemCallback, + skipDiff: Boolean = false + ) { kotlin.runCatching { val oldItems = this.items.toList() val callback = object : DiffUtil.Callback() { @@ -161,7 +165,7 @@ abstract class RecyclerAdapter(protected val context: Co onCurrentListChanged() } } - handler.postDelayed(500) { + if (skipDiff) handler.postDelayed(500) { if (diffJob?.isCompleted == false) { diffJob?.cancel() setItems(items) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 1e6f1841d..6adb69ca9 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -324,7 +324,7 @@ class BookSourceActivity : VMBaseActivity - adapter.setItems(data, adapter.diffItemCallback) + adapter.setItems(data, adapter.diffItemCallback, !Debug.isChecking) itemTouchCallback.isCanDrag = sort == BookSourceSort.Default delay(500) } diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index eb490b9d0..5f2c672a3 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -71,13 +71,16 @@ class MainActivity : VMBaseActivity(), private val fragmentMap = hashMapOf() private var bottomMenuCount = 4 private val realPositions = arrayOf(idBookshelf, idExplore, idRss, idMy) + private val adapter by lazy { + TabFragmentPageAdapter(supportFragmentManager) + } override fun onActivityCreated(savedInstanceState: Bundle?) { upBottomMenu() binding.run { viewPagerMain.setEdgeEffectColor(primaryColor) viewPagerMain.offscreenPageLimit = 3 - viewPagerMain.adapter = TabFragmentPageAdapter(supportFragmentManager) + viewPagerMain.adapter = adapter viewPagerMain.addOnPageChangeListener(PageChangeCallback()) bottomNavigationView.elevation = elevation bottomNavigationView.setOnNavigationItemSelectedListener(this@MainActivity) @@ -350,9 +353,14 @@ class MainActivity : VMBaseActivity(), private inner class PageChangeCallback : ViewPager.SimpleOnPageChangeListener() { override fun onPageSelected(position: Int) { + val oldPosition = pagePosition pagePosition = position binding.bottomNavigationView.menu .getItem(realPositions[position]).isChecked = true + val callback1 = fragmentMap[getFragmentId(position)] as? Callback + val callback2 = fragmentMap[getFragmentId(oldPosition)] as? Callback + callback1?.onActive() + callback2?.onInactive() } } @@ -391,4 +399,10 @@ class MainActivity : VMBaseActivity(), } + interface Callback { + fun onActive() + + fun onInactive() + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt index 16afdc259..dee779b81 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt @@ -23,6 +23,7 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryTextColor import io.legado.app.ui.book.explore.ExploreShowActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity +import io.legado.app.ui.main.MainActivity import io.legado.app.utils.applyTint import io.legado.app.utils.cnCompare import io.legado.app.utils.setEdgeEffectColor @@ -31,6 +32,8 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flowOn @@ -40,7 +43,7 @@ import kotlinx.coroutines.launch * 发现界面 */ class ExploreFragment : VMBaseFragment(R.layout.fragment_explore), - ExploreAdapter.CallBack { + ExploreAdapter.CallBack, MainActivity.Callback { override val viewModel by viewModels() private val binding by viewBinding(FragmentExploreBinding::bind) @@ -53,13 +56,14 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo private val groups = linkedSetOf() private var exploreFlowJob: Job? = null private var groupsMenu: SubMenu? = null + private var isActive = false override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { setSupportToolbar(binding.titleBar.toolbar) initSearchView() initRecyclerView() initGroupData() - upExploreData() + upExploreData(once = true) } override fun onCompatCreateOptionsMenu(menu: Menu) { @@ -72,6 +76,7 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo override fun onPause() { super.onPause() searchView.clearFocus() + exploreFlowJob?.cancel() } private fun initSearchView() { @@ -117,25 +122,29 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo } } - private fun upExploreData(searchKey: String? = null) { + private fun upExploreData(searchKey: String? = null, once: Boolean = false) { exploreFlowJob?.cancel() exploreFlowJob = launch { when { searchKey.isNullOrBlank() -> { appDb.bookSourceDao.flowExplore() } + searchKey.startsWith("group:") -> { val key = searchKey.substringAfter("group:") appDb.bookSourceDao.flowGroupExplore(key) } + else -> { appDb.bookSourceDao.flowExplore(searchKey) } }.catch { AppLog.put("发现界面更新数据出错", it) - }.conflate().collect { + }.conflate().flowOn(IO).collect { binding.tvEmptyMsg.isGone = it.isNotEmpty() || searchView.query.isNotEmpty() adapter.setItems(it, diffItemCallBack) + if (once) cancel() + delay(500) } } } @@ -202,4 +211,19 @@ class ExploreFragment : VMBaseFragment(R.layout.fragment_explo } } -} \ No newline at end of file + override fun onActive() { + isActive = true + upExploreData() + } + + override fun onInactive() { + isActive = false + exploreFlowJob?.cancel() + } + + override fun onResume() { + super.onResume() + if (isActive) upExploreData() + } + +}