ViewPager2(水平和垂直)在调用notifyDataSetChanged() 时不会刷新视图
你好,
我有一个用于ViewPager的水平适配器:
public class HorizontalAdapter extends FragmentStateAdapter { ... }
在HorizontalAdapter内,我创建了3 个VerticalContainerFragments,它们内部包含一个Vertical Adapter:
public class VerticalContainerFragment extends Fragment { ... }
public class InnerVerticalAdapter extends FragmentStateAdapter { }
InnerVerticalAdapter的内容是通过.newInstance() 生成的。
我想按下面的方式刷新InnerVerticalAdapter:
doubleViewPagerAdapter.getVerticalViewPager().getAdapter().notifyDataSetChanged();
但这行不通。VerticalViewPager不会刷新。
当我尝试这个
doubleViewPager.getAdapter().notifyDataSetChanged();
它也不会刷新。
没有任何效果。可是,为什么呢?
解决方案
这是 FragmentStateAdapter 在 ViewPager2 中的已知行为。默认的 getItemId(position) 会返回 position,因此适配器会将项视为未改变,在你调用 notifyDataSetChanged() 时不会重新创建Fragment。
使用在数据变化时会改变的稳定且唯一的ID。
例如:
public class InnerVerticalAdapter extends FragmentStateAdapter {
private long baseItemId = 0;
public InnerVerticalAdapter(@NonNull Fragment fragment) {
super(fragment);
}
@Override
public Fragment createFragment(int position) {
return YourContentFragment.newInstance(position);
}
@Override
public int getItemCount() {
return 3; // or your actual count
}
@Override
public long getItemId(int position) {
return baseItemId + position;
}
@Override
public boolean containsItem(long itemId) {
return itemId >= baseItemId && itemId < baseItemId + getItemCount();
}
public void refresh() {
baseItemId += getItemCount(); // Invalidate old IDs
notifyDataSetChanged();
}
}
需要刷新时,调用 refresh(),而不是 notifyDataSetChanged()。
替代方案:
如果你只需要刷新特定的位置:
adapter.notifyItemChanged(position);
这在不覆盖 getItemId() 的情况下也能工作。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。