ViewPager2(水平和垂直)在调用notifyDataSetChanged() 时不会刷新视图

移动开发 2026-07-12

你好,

我有一个用于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();

它也不会刷新。

没有任何效果。可是,为什么呢?

解决方案

这是 FragmentStateAdapterViewPager2 中的已知行为。默认的 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章