转载 Android ViewPager+Fragment数据传递和动态刷新成熟解决方案
2018-07-12 18:26
246 查看
个人记录 转载来自:https://blog.csdn.net/u011192530/article/details/53235862Fragment的数据传递用起来很简单,但深究起来,其中的很多坑想必大家都已经历过。ViewPager的适配器如何动态的刷新数据也是个头疼的问题。把这俩货放在一起很常见,但却是坑中坑。通过长时间的发现问题和解决问题,我们摸索出ViewPager+Fragment的成熟解决方案,现贡献给大家。解决方案主要包括Fragment和ViewPager适配器关键部分代码的常规写法。
1、Fragment的实例化主要是统一Fragment的实例化工作。如果Fragment需要外部传递参数,在此函数中要构造相关参数。
- public static CategoryListFragment newInstance(int pageType, Category parentCategory) {
- CategoryListFragment f = new CategoryListFragment();
- Bundle b = new Bundle();
- b.putInt("pageType", pageType);
- b.putSerializable("parentCategory", parentCategory);
- f.setArguments(b);
- return f;
- }
2、Fragment参数的获取一定要在onCreate方法获取参数。有很多同学可能在onCreateView中获取参数,而此方法在某些状态下并不会被调用,导致数据丢失。
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Bundle args = getArguments();
- if (args != null) {
- pageType = args.getInt("pageType");
- parentCategory = (Category) args.getSerializable("parentCategory");
- }
- }
3、Fragment参数的更新更新Fragment内部成员变量的同时也要更新args参数中的值。此步骤要和ViewPager适配器配合使用,实现Fragment动态刷新。
- public void updateArguments(int pageType, Category parentCategory) {
- this.pageType=pageType;
- this.parentCategory=parentCategory;
- Bundle args = getArguments();
- if (args != null) {
- args.putInt("pageType", pageType);
- args.putSerializable("parentCategory", parentCategory);
- }
- }
下面描述ViewPager适配器写法,以FragmentPagerAdapter适配器为例子。1、getItem此方法必须实现,返回具体Fragment,并且初始化Fragment需要的参数。
- @Override
- public Fragment getItem(int position) {
- Tab tab = tabs.get(position);
- return CategoryListFragment.newInstance(tab.pageType, tab.category);
- }
2、instantiateItem如果你要动态刷新数据,必须实现此方法,并且仅能在此方法里,不能是getItem。否则调用notifyDataSetChanged无效。
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- CategoryListFragment fragment = (CategoryListFragment) super.instantiateItem(container, position);
- Tab tab = tabs.get(position);
- fragment.updateArguments(tab.pageType, tab.category);
return fragment;
}
3、getItemPosition返回PagerAdapter.POSITION_NONE保证调用notifyDataSetChanged刷新Fragment。
- @Override
- public int getItemPosition(Object object) {
- return PagerAdapter.POSITION_NONE;
- }
相关文章推荐
- Android ViewPager刷新Fragment数据(ViewPager获取Fragment对象)
- 如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面?
- Android ViewPager刷新Fragment数据(ViewPager获取Fragment对象)
- 【Android】FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究或不执行OnCreatView方法导致界面不刷新
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究或不执行OnCreatView方法导致界面不刷新
- Android ViewPager中切换fragment刷新数据
- Android ViewPager Fragment 切换刷新数据,解决生命周期只走一次的问题
- Android应用ViewPager和TabLayout动态加载Fragment,并实现view和tab动态刷新。
- android Viewpager中fragment的数据刷新
- Android-ViewPager+Fragment数据更新问题
- (4.3.1.13)Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android viewpager+fragment实现动态加载碎片(fragment重复使用)
- FragmentPagerAdapter与FragmentStatePagerAdapter的区别+ViewPager数据刷新问题详解
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android-ViewPager+Fragment数据更新问题
- Fragment嵌套Viewpager嵌套Fragment,切换后数据不见了解决方案....
- Activity,ViewPager,Fragment和TabLayout数据传递
- Fragment+ViewPager滑动,网络恢复时滑动刷新Fragment数据
- Android Viewpager动态删除Fragment解析
- Android Viewpager PagerAdapter update data 刷新界面数据