gpt4 book ai didi

android - 删除 viewPager2 中的 fragment 使用 FragmentStateAdapter,但仍显示

转载 作者:行者123 更新时间:2023-12-03 13:24:45 26 4
gpt4 key购买 nike

我有viewPager2和FragmentStateAdapter,还有Fragement1、2,3 4,我在fragment2,想去掉fragment3,在fragment2之后显示fragment4。
问题是它总是显示 fragment 3(数据),调试显示 fragment 3已被删除,但显示的页面仍然有 fragment 3内容。

适配器:

class TipsAdapter(
private val items: MutableList<TripPage>,
context: FragmentActivity
) : FragmentStateAdapter(context) {

private val fragmentFactory = context.supportFragmentManager.fragmentFactory
private val classLoader = context.classLoader

override fun getItemCount(): Int = items.size

override fun createFragment(position: Int): Fragment {
val pageInfo = items[position]
val fragment = fragmentFactory.instantiate(classLoader, pageInfo.fragmentClass.name)
fragment.arguments = Bundle().also { it.putParcelable(PAGE_INFO, pageInfo) }
return fragment
}

fun getFragmentName(position: Int) = items[position].fragmentClass.simpleName

fun removeFragment(position: Int) {
items.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position, items.size)
notifyDataSetChanged()
}

}

删除 fragment 代码:
      if ((view_pager.adapter as TipsAdapter).getFragmentName(index + 1).equals(
TripPreFragment::class.simpleName) &&
viewModel.shouldRemoveBulkApply()) {
(view_pager.adapter as TipsAdapter).removeFragment(index + 1)
view_pager.setCurrentItem(index + 1, true)
} else {
view_pager.setCurrentItem(index + 1, true)
}

最佳答案

最后,它对我有用。当我们调用 notifyDataSetChanged() , android 会调用
方法getItemId()在适配器中,检查项目是否已更新。它返回源代码中的位置。这意味着在列表 0..i..n , 如果您删除 i , 变为 0...i...n-1 , i不会改变,数据也不会在 adater 中更新。

    /**
* Default implementation works for collections that don't add, move, remove items.
* <p>
* TODO(b/122670460): add lint rule
* When overriding, also override {@link #containsItem(long)}.
* <p>
* If the item is not a part of the collection, return {@link RecyclerView#NO_ID}.
*
* @param position Adapter position
* @return stable item id {@link RecyclerView.Adapter#hasStableIds()}
*/
@Override
public long getItemId(int position) {
return position;
}
你需要做的是重写这个方法和 containsItem(long) ,
就我而言,我使用每个 fragment 的哈希码:
class TipsAdapter(
private val items: MutableList<TripPreferencesOptimizerPage>,
context: FragmentActivity
) : FragmentStateAdapter(context) {

private val fragmentFactory = context.supportFragmentManager.fragmentFactory
private val classLoader = context.classLoader
private val pageIds= items.map { it.hashCode().toLong() }

override fun getItemCount(): Int = items.size

override fun createFragment(position: Int): Fragment {
val pageInfo = items[position]
val fragment = fragmentFactory.instantiate(classLoader, pageInfo.fragmentClass.name)
fragment.arguments = Bundle().also { it.putParcelable(PAGE_INFO, pageInfo) }
return fragment
}

fun getFragmentName(position: Int) = items[position].fragmentClass.simpleName

fun removeFragment(position: Int) {
items.removeAt(position)
notifyItemRangeChanged(position, items.size)
notifyDataSetChanged()
}

override fun getItemId(position: Int): Long {
return items[position].hashCode().toLong() // make sure notifyDataSetChanged() works
}

override fun containsItem(itemId: Long): Boolean {
return pageIds.contains(itemId)
}
}

关于android - 删除 viewPager2 中的 fragment 使用 FragmentStateAdapter,但仍显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57938930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com