Android 中一般使用
ViewPager
实现左右滑动界面,网上有文章介绍RecyclerView
也可以实现相同的效果。
谷歌将推出 ViewPager2,内部使用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.id.view_pager);
给ViewPager设置id后就不会报错了。
参考资料:
ViewPager内嵌Fragment刷新的坑
选择正确的 Fragment#commitXXX() 函数
FragmentPagerAdapter强制刷新