ViewPager+Fragment+ FragmentPage

2018-01-10  本文已影响2013人  灰太狼_zq

问题1:ViewPager 强制刷新问题
在带屏项目中遇到如下问题:先看图


效果图

先分析布局:
首先最外部是一个Activity,activity 里面定不出是标题栏,保存按钮等.接着是一个tablayout ,下面是可以滑动的,使用ViewPager来做,ViewPager 内部就是 我们的fragment啦.
标题栏和下面的fragment对应,要求是除了自定义页面,还要显示7个菜谱即可,但是这里数量是根据本地菜谱来浮动的,举例
本地存储了2个菜谱,那网络菜谱的数量=7-2
本地存储了3个菜谱,那网络菜谱的数量=7-3
这些都还好做
麻烦的是顶部的开始(在自定义菜谱页,显示成保存),点击保存,就保存菜谱到本地数据,然后刷新这个activity 中的fragment .
这样的代价是很大的,但是需求最大嘛.
问题来了?在不销毁activity和控件的前提下怎么强制刷新所有的fragment?
举例:当面页面有2个本地菜谱+4个网络菜谱,保存成功之后,变成3个本地菜谱+3个网络菜谱?
我们ViewPager使用的数据源是FragmentPagerAdapter提供的?
改变FragmentPagerAdapter的fragment数组数量?在刷新adapter ,我第一反应也是这样的.但是经过测试,根本无任何效果.所以想到,肯定是有复用机制啦,经过研究的确是有复用机制.
必须使用fragment 的fragmentmanager来移除所有的fragment,在赋值新的fragmentlist(所以说这样性能代价太大啦)

 public void setFragments(List<Fragment> newFragmentList, String[] title) {
    this.title = title;//重新赋值顶部的title
    if (this.mFragmentList != null) {
        FragmentTransaction ft = fm.beginTransaction();//获得FragmentTransaction 事务
        for (Fragment f : this.mFragmentList) {
            ft.remove(f); //遍历删除fragment
        }
        ft.commit(); 
        ft = null;
        fm.executePendingTransactions();提交事务
    }
    this.mFragmentList = newFragmentList;//重新赋值
    notifyDataSetChanged(); 刷新界面
  }

就这样就实现了强制刷新啦.

问题2:Tablayout 和ViewPager的使用,标题栏一直不出现的问题
Tablayout 和ViewPager结合使用是经常用到的案例,也是Android material design 的经典设计.
将两者结合起来,只需要简单调用如下语句就可以了.
mTablayout.setupWithViewPager(mViewPager);
那Tablayout的标题从哪里来了?肯定是FragmentPagerAdapter 啦
所以在FragmentPagerAdapter override 重新一下方法,
写一个title的方法,果然有,getTitle,这不是吗?getTitle 就是这个,编译
运行


image.png

可是怎么就是不出来了?肯定数据出了问题.一步一步的调试.发现数据没问题啊.难道是布局的问题,又回去检查XML 检查tablayout 的设置 等等....没办法,只有百度,各种方法试了个遍,都不行.....只有回去翻看以前的项目....
才发现是方法重新错了......真是坑.......


image.png
上一篇下一篇

猜你喜欢

热点阅读