ViewPager 与 Fragment的刷新问题。

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

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

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

List<Fragment>.clear();
List<Fragment>.addAll(data);
notifyDataSetChanged();

或者

ViewPager.setAdapter(adapter);

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

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

2203673-d8a1b186671bbb0e.png
instantiateItem
FragmentPagerAdapter

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

FragmentTransaction ft = getFragmentManager().beginTransaction();
for (Fragment fragment: data) {
    ft.remove(fragment);
}
ft.commitNow();
List<Fragment>.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.

2203673-8a44fa793c8e4f99.png
instantiateItem

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

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

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

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

参考资料:

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

猜你喜欢

转载自blog.csdn.net/weixin_34174132/article/details/87448550