我正在使用ViewPager2
和FragmentStateAdapter
。
public class MyAdapter extends FragmentStateAdapter {
public MyAdapter(@NonNull Fragment fragment) {
super(fragment);
}
@NonNull
@Override
public Fragment createFragment(int position) {
return MyFragment.newInstance(MyClass.func(position));
}
@Override
public int getItemCount() {
return MyClass.NUM;
}
}
不幸的是,在适配器上调用notifyDataSetChanged()
完全无效(调用notifyItemChanged(position)
可以正常工作)。
我该如何解决?
答案 0 :(得分:1)
我今天注意到了这一点,并且在IssueTracker中为此here创建了一个错误报告。但是,对我来说,即使notifyItemChanged(position:)
和notifyItemRangeChanged(positionStart:itemCount:)
方法的行为也不正确。
该错误似乎是因为FragmentStateAdapter.getItemId(position:)
方法的默认实现是简单地返回传递给它的position
。因此,在每次itemId
调用之前和之后,每个position
的{{1}}都是相同的,因此将不会重新创建FragmentStateAdapter.notifyDataSetChanged()
。
一个可能的解决方法是引入一个偏移量,该偏移量会在每次调用Fragment
之后调整itemId
的值,从而强制重新生成片段。请参见下面的notifyDataSetChanged()
类中的init
块,它有助于解决此问题; ViewPagerAdapter
被注册在此块中,每当调用AdapterDataObserver
时,该块都会收到回调。
notifyDataSetChanged()