我将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)
工作正常)。
我该如何解决这个问题?
2条答案
按热度按时间rsl1atfo1#
我已经在IssueTracker中为here创建了一个bug报告,但对我来说,即使是
notifyItemChanged(position:)
和notifyItemRangeChanged(positionStart:itemCount:)
方法也是错误的。该错误是由于
FragmentStateAdapter.getItemId(position:)
方法的默认实现,该方法只返回传入的position
。因此,每个position
的itemId
在FragmentStateAdapter.notifyDataSetChanged()
调用前后都是相同的,因此不会重新创建任何Fragment
。一种可能的解决方法是在
FragmentStateAdapter
实现中为每个页面分配一个唯一的ID,并在每次调用notifyDataSetChanged()
方法时为每个页面分配一个新的ID。请参阅下面ViewPagerAdapter
类中的init
块,它有助于实现此解决方法:AdapterDataObserver
对象注册在此init
块中,以便每当调用notifyDataSetChanged()
时,它都接收回调。wkftcu5l2#
在将Adapter()设置到您的视图页之前,请将
viewPager.setSaveFromParentEnabled(false);