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没有变化,打印日志发现Fragment
的onCreate()
方法没有走;
在FragmentPagerAdapter
中会使用原来已创建的Fragment
,但有时确实需要刷新整个ViewPager
。

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.

当使用 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强制刷新
网友评论