ViewPager 与 Fragment的刷新问题。

Android 中一般使用ViewPager实现左右滑动界面,网上有文章介绍RecyclerView也可以实现相同的效果。
谷歌将推出 ViewPager2,内部使用RecyclerView实现。

在App中需要制作一个类似新闻列表的界面需要支持左滑右滑,按照官方文档Creating swipe views with tabs 很愉快的写出了符合预期的界面;

新的需求需要刷新整个ViewPager,开始通过

List.clear();
List.addAll(data);
notifyDataSetChanged();

或者

ViewPager.setAdapter(adapter);

发现Indicator的UI和数据有变化,但Fragment的UI没有变化,打印日志发现FragmentonCreate()方法没有走;

原来在FragmentPagerAdapter中会使用已创建的Fragment,但有时确实需要刷新整个ViewPager

instantiateItem
FragmentPagerAdapter

一丶 一种方法是更新Adapter数据前先移除FragmentManager中的数据;

FragmentTransaction ft = getFragmentManager().beginTransaction();
for (Fragment fragment: data) {
    ft.remove(fragment);
}
ft.commitNow();
List.clear();

二丶 另一种方法使用 POSITION_NONE,但我测试这种方法设置未生效;

@Override
public int getItemPosition(@NonNull Object object) {
    return POSITION_NONE;
}
FragmentStatePagerAdapter

This is best for paging across a collection of objects for which the number of pages is undetermined. It destroys fragments as the user navigates to other pages, minimizing memory usage.

instantiateItem

当使用 FragmentStatePagerAdapter时,因instantiateItem会每次从Adapter也就是我的List中取,所以也可以很方便实现想要的效果。

再记录个问题:ViewPager with adapter requires a view id
出现这个问题是因为我们代码编写ViewPager,但是没有给ViewPager设置ID导致的;

ViewPager viewPager = new ViewPager(context);
viewPager.setId(R.id.view_pager);

给ViewPager设置id后就不会报错了。

参考资料:

ViewPager内嵌Fragment刷新的坑
选择正确的 Fragment#commitXXX() 函数
FragmentPagerAdapter强制刷新

你可能感兴趣的:(ViewPager 与 Fragment的刷新问题。)