Android 删除viewPager2中的片段使用FragmentStateAdapter,但仍显示
我有一个viewPager2和FragmentStateAdapter,还有Fragment1、2、3和4,我在fragment2中,希望删除fragment3,并在fragment2之后显示fragment4。 问题是它总是显示fragment3(数据),调试显示fragment3已被删除,但显示的页面仍有fragment3内容 主持人:Android 删除viewPager2中的片段使用FragmentStateAdapter,但仍显示,android,android-viewpager,fragmentstatepageradapter,android-viewpager2,Android,Android Viewpager,Fragmentstatepageradapter,Android Viewpager2,我有一个viewPager2和FragmentStateAdapter,还有Fragment1、2、3和4,我在fragment2中,希望删除fragment3,并在fragment2之后显示fragment4。 问题是它总是显示fragment3(数据),调试显示fragment3已被删除,但显示的页面仍有fragment3内容 主持人: class TipsAdapter( private val items: MutableList<TripPage>, context: Fr
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()
}
最后,它对我有用。当我们调用notifyDataSetChanged()时,android将调用 方法
getItemId()
,检查项目是否已更新。它返回源代码中的位置。这意味着在列表0..i..n
中,如果删除i
,它将变为0..i..n-1
,则i
不会更改,数据也不会在适配器中更新
/**
* 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;
}
请找到更多有用的信息:哇,你太棒了!你拯救了这一天:)Cheers@Xianwei这是API的一个完全不同的部分,不幸的是不相关。我花了几个小时试图解决这个问题。不幸的是,Android并不总是直观的,关于这些用例的文档也不完整。我有两个片段mainfragment和otherfragment。我在每5个位置添加otherfragment,它不在arraylist中,所以如果它不在列表中,如何删除该otherfragment?我有2个片段mainfragment和otherfragment。我在每5个位置添加otherfragment,但它不在arraylist中,所以如果它不在列表中,如何删除该otherfragment?我正在使用viewpager2
/**
* 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;
}
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)
}
}