From a4cfe21ddbb4008220840c25a1052bd72a0d3268 Mon Sep 17 00:00:00 2001 From: niuhb Date: Sun, 5 Jan 2025 09:13:49 +0800 Subject: [PATCH] =?UTF-8?q?rss=E6=A8=A1=E5=9D=97viewPager=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E4=B8=BAviewPager2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/rss/article/RssSortActivity.kt | 42 ++++------- .../app/ui/rss/article/RssSortViewModel.kt | 2 +- .../ui/rss/favorites/RssFavoritesActivity.kt | 73 +++++++++++-------- .../main/res/layout/activity_rss_artivles.xml | 9 +-- .../res/layout/activity_rss_favorites.xml | 9 +-- gradle/libs.versions.toml | 6 +- 6 files changed, 69 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt index eef87514dbe9..2bb2cb43064e 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt @@ -1,15 +1,14 @@ -@file:Suppress("DEPRECATION") - package io.legado.app.ui.rss.article +import android.annotation.SuppressLint import android.os.Bundle import android.view.Menu import android.view.MenuItem -import android.view.ViewGroup import androidx.activity.viewModels import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.lifecycleScope +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayoutMediator import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.databinding.ActivityRssArtivlesBinding @@ -30,9 +29,8 @@ class RssSortActivity : VMBaseActivity() - private val adapter by lazy { TabFragmentPageAdapter() } + private val adapter by lazy { TabFragmentPageAdapter(this) } private val sortList = mutableListOf>() - private val fragmentMap = hashMapOf() private val editSourceResult = registerForActivityResult( StartActivityContract(RssSourceEditActivity::class.java) ) { @@ -45,7 +43,10 @@ class RssSortActivity : VMBaseActivity + tab.text = sortList[position].first + }.attach() binding.tabLayout.setSelectedTabIndicatorColor(accentColor) viewModel.titleLiveData.observe(this) { binding.titleBar.title = it @@ -99,6 +100,7 @@ class RssSortActivity : VMBaseActivity() { override val binding by viewBinding(ActivityRssFavoritesBinding::inflate) - private val adapter by lazy { TabFragmentPageAdapter() } + private val adapter by lazy { TabFragmentPageAdapter(this) } private var groupList = mutableListOf() private var groupsMenu: SubMenu? = null private var currentGroup = "" @@ -65,22 +65,15 @@ class RssFavoritesActivity : BaseActivity() { private fun initView() { binding.viewPager.adapter = adapter - binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - } - + binding.viewPager.offscreenPageLimit = 1 + binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { currentGroup = groupList[position] } - - override fun onPageScrollStateChanged(state: Int) {} - }) - binding.tabLayout.setupWithViewPager(binding.viewPager) + TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> + tab.text = groupList[position] + }.attach() binding.tabLayout.setSelectedTabIndicatorColor(accentColor) } @@ -100,7 +93,7 @@ class RssFavoritesActivity : BaseActivity() { override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { if (item.groupId == R.id.menu_group) { - binding.viewPager.setCurrentItem(item.order) + binding.viewPager.currentItem = item.order } else { when (item.itemId) { R.id.menu_del_group -> deleteGroup() @@ -115,6 +108,8 @@ class RssFavoritesActivity : BaseActivity() { appDb.rssStarDao.flowGroups().catch { AppLog.put("订阅分组数据获取失败\n${it.localizedMessage}", it) }.distinctUntilChanged().flowOn(IO).collect { + val callBack = PageDiffUtil(groupList, it) + val diff = DiffUtil.calculateDiff(callBack) groupList.clear() groupList.addAll(it) if (groupList.size == 1) { @@ -125,7 +120,7 @@ class RssFavoritesActivity : BaseActivity() { if (groupsMenu != null) { upGroupsMenu() } - adapter.notifyDataSetChanged() + diff.dispatchUpdatesTo(adapter) } } } @@ -152,24 +147,42 @@ class RssFavoritesActivity : BaseActivity() { } } - private inner class TabFragmentPageAdapter : - FragmentStatePagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + private inner class TabFragmentPageAdapter(rssFavoritesActivity: RssFavoritesActivity) : + FragmentStateAdapter(rssFavoritesActivity) { + override fun getItemCount(): Int { + return groupList.size + } - override fun getItemPosition(`object`: Any): Int { - return POSITION_NONE + override fun createFragment(position: Int): Fragment { + val group = groupList[position] + return RssFavoritesFragment(group) } - override fun getPageTitle(position: Int): CharSequence { - return groupList[position] + override fun getItemId(position: Int): Long { + return groupList[position].hashCode().toLong() } - override fun getItem(position: Int): Fragment { - val group = groupList[position] - return RssFavoritesFragment(group) + override fun containsItem(itemId: Long): Boolean { + return groupList.any { it.hashCode().toLong() == itemId } } + } - override fun getCount(): Int { - return groupList.size + //DiffUtil对比差异 + private inner class PageDiffUtil(val oldList: List, val newList: List): DiffUtil.Callback() { + override fun getOldListSize(): Int { + return oldList.size + } + + override fun getNewListSize(): Int { + return newList.size + } + + override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return oldList[oldItemPosition].hashCode() == newList[newItemPosition].hashCode() + } + + override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { + return oldList[oldItemPosition].hashCode() == newList[newItemPosition].hashCode() } } diff --git a/app/src/main/res/layout/activity_rss_artivles.xml b/app/src/main/res/layout/activity_rss_artivles.xml index 27a0dff9dace..3321d1f5d3e6 100644 --- a/app/src/main/res/layout/activity_rss_artivles.xml +++ b/app/src/main/res/layout/activity_rss_artivles.xml @@ -1,9 +1,8 @@ - + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_rss_favorites.xml b/app/src/main/res/layout/activity_rss_favorites.xml index 59e3ab0fa3fc..17cca0c366bb 100644 --- a/app/src/main/res/layout/activity_rss_favorites.xml +++ b/app/src/main/res/layout/activity_rss_favorites.xml @@ -1,9 +1,8 @@ - + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 18b74bb9e558..29da68772423 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,10 +43,8 @@ desugar = "2.0.4" activity = "1.9.1" kotlinxSerialization = "1.7.1" swiperefreshlayout = "1.1.0" -#noinspection GradleDependency -recyclerview = "1.2.0" -#noinspection GradleDependency -viewpager2 = "1.0.0" +recyclerview = "1.3.2" +viewpager2 = "1.1.0" webkit = "1.11.0" zxingLite = "3.2.0"