Skip to content

Commit

Permalink
rss模块viewPager替换为viewPager2
Browse files Browse the repository at this point in the history
  • Loading branch information
niu-hb committed Jan 5, 2025
1 parent 0fa0645 commit a4cfe21
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 72 deletions.
42 changes: 15 additions & 27 deletions app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -30,9 +29,8 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo

override val binding by viewBinding(ActivityRssArtivlesBinding::inflate)
override val viewModel by viewModels<RssSortViewModel>()
private val adapter by lazy { TabFragmentPageAdapter() }
private val adapter by lazy { TabFragmentPageAdapter(this) }
private val sortList = mutableListOf<Pair<String, String>>()
private val fragmentMap = hashMapOf<String, Fragment>()
private val editSourceResult = registerForActivityResult(
StartActivityContract(RssSourceEditActivity::class.java)
) {
Expand All @@ -45,7 +43,10 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo

override fun onActivityCreated(savedInstanceState: Bundle?) {
binding.viewPager.adapter = adapter
binding.tabLayout.setupWithViewPager(binding.viewPager)
binding.viewPager.offscreenPageLimit = 1
TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position ->
tab.text = sortList[position].first
}.attach()
binding.tabLayout.setSelectedTabIndicatorColor(accentColor)
viewModel.titleLiveData.observe(this) {
binding.titleBar.title = it
Expand Down Expand Up @@ -99,6 +100,7 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
return super.onCompatOptionsItemSelected(item)
}

@SuppressLint("NotifyDataSetChanged")
private fun upFragments() {
lifecycleScope.launch {
viewModel.rssSource?.sortUrls()?.let {
Expand All @@ -119,7 +121,7 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
val countRead = viewModel.countRead()
setMessage(getString(R.string.sure_del) + "\n" + countRead + " " + getString(R.string.read_record))
noButton()
yesButton(){
yesButton {
viewModel.delReadRecord()
}
}
Expand Down Expand Up @@ -150,31 +152,17 @@ class RssSortActivity : VMBaseActivity<ActivityRssArtivlesBinding, RssSortViewMo
viewModel.rssSource?.setVariable(variable)
}

private inner class TabFragmentPageAdapter :
FragmentStatePagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

override fun getItemPosition(`object`: Any): Int {
return POSITION_NONE
}
private inner class TabFragmentPageAdapter(rssSortActivity: RssSortActivity) :
FragmentStateAdapter(rssSortActivity) {

override fun getPageTitle(position: Int): CharSequence {
return sortList[position].first
override fun getItemCount(): Int {
return sortList.size
}

override fun getItem(position: Int): Fragment {
override fun createFragment(position: Int): Fragment {
val sort = sortList[position]
return RssArticlesFragment(sort.first, sort.second)
}

override fun getCount(): Int {
return sortList.size
}

override fun instantiateItem(container: ViewGroup, position: Int): Any {
val fragment = super.instantiateItem(container, position) as Fragment
fragmentMap[sortList[position].first] = fragment
return fragment
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
fun switchLayout() {
rssSource?.let {
if (it.articleStyle < 2) {
it.articleStyle = it.articleStyle + 1
it.articleStyle += 1
} else {
it.articleStyle = 0
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
@file:Suppress("DEPRECATION")

package io.legado.app.ui.rss.favorites

import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.SubMenu
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.lifecycleScope
import androidx.viewpager.widget.ViewPager
import androidx.recyclerview.widget.DiffUtil
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayoutMediator
import io.legado.app.R
import io.legado.app.base.BaseActivity
import io.legado.app.constant.AppLog
Expand All @@ -33,7 +33,7 @@ import kotlinx.coroutines.launch
class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {

override val binding by viewBinding(ActivityRssFavoritesBinding::inflate)
private val adapter by lazy { TabFragmentPageAdapter() }
private val adapter by lazy { TabFragmentPageAdapter(this) }
private var groupList = mutableListOf<String>()
private var groupsMenu: SubMenu? = null
private var currentGroup = ""
Expand Down Expand Up @@ -65,22 +65,15 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {

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)
}

Expand All @@ -100,7 +93,7 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {

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()
Expand All @@ -115,6 +108,8 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {
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) {
Expand All @@ -125,7 +120,7 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {
if (groupsMenu != null) {
upGroupsMenu()
}
adapter.notifyDataSetChanged()
diff.dispatchUpdatesTo(adapter)
}
}
}
Expand All @@ -152,24 +147,42 @@ class RssFavoritesActivity : BaseActivity<ActivityRssFavoritesBinding>() {
}
}

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<String>, val newList: List<String>): 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()
}

}
Expand Down
9 changes: 4 additions & 5 deletions app/src/main/res/layout/activity_rss_artivles.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">

<io.legado.app.ui.widget.TitleBar
Expand All @@ -15,12 +14,12 @@
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/group"
app:tabMode="scrollable" />

<androidx.viewpager.widget.ViewPager
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="SpeakableTextPresentCheck" />
android:layout_height="match_parent" />

</LinearLayout>
9 changes: 4 additions & 5 deletions app/src/main/res/layout/activity_rss_favorites.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">

<io.legado.app.ui.widget.TitleBar
Expand All @@ -16,12 +15,12 @@
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/group"
app:tabMode="scrollable" />

<androidx.viewpager.widget.ViewPager
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="SpeakableTextPresentCheck" />
android:layout_height="match_parent" />

</LinearLayout>
6 changes: 2 additions & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down

0 comments on commit a4cfe21

Please sign in to comment.