diff --git a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style1/BookshelfFragment1.kt b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style1/BookshelfFragment1.kt index 565766f4e..194bd3c34 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style1/BookshelfFragment1.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style1/BookshelfFragment1.kt @@ -2,6 +2,7 @@ package io.legato.kazusa.ui.main.bookshelf.style1 +import android.annotation.SuppressLint import android.os.Bundle import android.view.View import android.view.ViewGroup @@ -9,7 +10,9 @@ import androidx.appcompat.widget.SearchView import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter +import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator import io.legato.kazusa.R import io.legato.kazusa.data.appDb import io.legato.kazusa.data.entities.Book @@ -42,7 +45,6 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) } private val binding by viewBinding(FragmentBookshelf1Binding::bind) - private val adapter by lazy { TabFragmentPageAdapter(childFragmentManager) } private val tabLayout: TabLayout by lazy { binding.tabLayout.findViewById(R.id.tab_layout) } @@ -50,6 +52,8 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) private val fragmentMap = hashMapOf() override val groupId: Long get() = selectedGroup?.groupId ?: 0 + private lateinit var adapter: TabFragmentPageAdapter + override val books: List get() { val fragment = fragmentMap[groupId] @@ -63,16 +67,16 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) } private val selectedGroup: BookGroup? - get() = bookGroups.getOrNull(tabLayout.selectedTabPosition) + get() = bookGroups.getOrNull(binding.viewPagerBookshelf.currentItem) private fun initView() { - //binding.viewPagerBookshelf.setEdgeEffectColor(primaryColor) - //tabLayout.isTabIndicatorFullWidth = false - //tabLayout.tabMode = TabLayout.MODE_SCROLLABLE - // tabLayout.setSelectedTabIndicatorColor(requireContext().accentColor) - tabLayout.setupWithViewPager(binding.viewPagerBookshelf) - binding.viewPagerBookshelf.offscreenPageLimit = 1 + adapter = TabFragmentPageAdapter(this) binding.viewPagerBookshelf.adapter = adapter + binding.viewPagerBookshelf.offscreenPageLimit = 1 + + TabLayoutMediator(binding.tabLayout, binding.viewPagerBookshelf) { tab, position -> + tab.text = bookGroups[position].groupName + }.attach() } override fun onQueryTextSubmit(query: String?): Boolean { @@ -84,6 +88,7 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) return false } + @SuppressLint("NotifyDataSetChanged") @Synchronized override fun upGroup(data: List) { if (data.isEmpty()) { @@ -93,11 +98,21 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) bookGroups.clear() bookGroups.addAll(data) adapter.notifyDataSetChanged() + adapter = TabFragmentPageAdapter(this) + binding.viewPagerBookshelf.adapter = adapter + + TabLayoutMediator(binding.tabLayout, binding.viewPagerBookshelf) { tab, position -> + tab.text = bookGroups[position].groupName + }.attach() + selectLastTab() - for (i in 0 until adapter.count) { - tabLayout.getTabAt(i)?.view?.setOnLongClickListener { - showDialogFragment(GroupEditDialog(bookGroups[i])) - true + + binding.tabLayout.post { + for (i in 0 until bookGroups.size) { + binding.tabLayout.getTabAt(i)?.view?.setOnLongClickListener { + showDialogFragment(GroupEditDialog(bookGroups[i])) + true + } } } } @@ -105,14 +120,24 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) } override fun upSort() { - adapter.notifyDataSetChanged() + childFragmentManager.fragments.forEach { + if (it is BooksFragment) { + val position = it.position + val group = bookGroups.getOrNull(position) ?: return@forEach + val newSort = group.getRealBookSort() + it.setEnableRefresh(group.enableRefresh) + if (it.bookSort != newSort) { + it.upBookSort(newSort) + } + } + } } private fun selectLastTab() { - tabLayout.post { - tabLayout.removeOnTabSelectedListener(this) - tabLayout.getTabAt(AppConfig.saveTabPosition)?.select() - tabLayout.addOnTabSelectedListener(this) + binding.tabLayout.post { + binding.tabLayout.removeOnTabSelectedListener(this) + binding.tabLayout.getTabAt(AppConfig.saveTabPosition)?.select() + binding.tabLayout.addOnTabSelectedListener(this) } } @@ -134,54 +159,14 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) fragmentMap[groupId]?.gotoTop() } - private inner class TabFragmentPageAdapter(fm: FragmentManager) : - FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + private inner class TabFragmentPageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + override fun getItemCount(): Int = bookGroups.size - override fun getPageTitle(position: Int): CharSequence { - return bookGroups[position].groupName - } - - /** - * 确定视图位置是否更改时调用 - * @return POSITION_NONE 已更改,刷新视图. POSITION_UNCHANGED 未更改,不刷新视图 - */ - override fun getItemPosition(any: Any): Int { - val fragment = any as BooksFragment - val position = fragment.position - val group = bookGroups.getOrNull(position) - if (fragment.groupId != group?.groupId) { - return POSITION_NONE - } - val bookSort = group.getRealBookSort() - fragment.setEnableRefresh(group.enableRefresh) - if (fragment.bookSort != bookSort) { - fragment.upBookSort(bookSort) - } - return POSITION_UNCHANGED - } - - override fun getItem(position: Int): Fragment { + override fun createFragment(position: Int): Fragment { val group = bookGroups[position] - return BooksFragment(position, group) - } - - override fun getCount(): Int { - return bookGroups.size - } - - override fun instantiateItem(container: ViewGroup, position: Int): Any { - var fragment = super.instantiateItem(container, position) as BooksFragment - val group = bookGroups[position] - /** - * Activity recreate 会复用之前的 Fragment,不正确的需要重新创建 - */ - if (fragment.isCreated && getItemPosition(fragment) == POSITION_NONE) { - destroyItem(container, position, fragment) - fragment = super.instantiateItem(container, position) as BooksFragment - } + val fragment = BooksFragment(position, group) fragmentMap[group.groupId] = fragment return fragment } - } } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortActivity.kt b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortActivity.kt index e89514310..ce475bd64 100644 --- a/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortActivity.kt @@ -8,8 +8,11 @@ import android.view.MenuItem import android.view.ViewGroup import androidx.activity.viewModels import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.lifecycleScope +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayoutMediator import io.legato.kazusa.R import io.legato.kazusa.base.VMBaseActivity import io.legato.kazusa.databinding.ActivityRssArtivlesBinding @@ -29,9 +32,9 @@ class RssSortActivity : VMBaseActivity() - private val adapter by lazy { TabFragmentPageAdapter() } + + private var adapter: TabFragmentPageAdapter? = null private val sortList = mutableListOf>() - private val fragmentMap = hashMapOf() private val editSourceResult = registerForActivityResult( StartActivityContract(RssSourceEditActivity::class.java) ) { @@ -44,11 +47,11 @@ class RssSortActivity : VMBaseActivity viewModel.clearSortCache { upFragments() } + R.id.menu_set_source_variable -> setSourceVariable() + R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let { editSourceResult.launch { putExtra("sourceUrl", it) @@ -100,16 +105,24 @@ class RssSortActivity : VMBaseActivity + tab.text = sortList[position].first + }.attach() } } @@ -138,31 +151,16 @@ class RssSortActivity : VMBaseActivity> + ) : FragmentStateAdapter(activity) { - override fun getItemPosition(`object`: Any): Int { - return POSITION_NONE - } + override fun getItemCount(): Int = items.size - override fun getPageTitle(position: Int): CharSequence { - return sortList[position].first - } - - override fun getItem(position: Int): Fragment { - val sort = sortList[position] + override fun createFragment(position: Int): Fragment { + val sort = items[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 - } } - -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/activity_rss_artivles.xml b/app/src/main/res/layout/activity_rss_artivles.xml index f8e62be53..781495481 100644 --- a/app/src/main/res/layout/activity_rss_artivles.xml +++ b/app/src/main/res/layout/activity_rss_artivles.xml @@ -43,7 +43,7 @@ - -