Fragment的Adapter分析及懒加载
来源:互联网 发布:vscode css提示插件 编辑:程序博客网 时间:2024/06/05 10:43
Viewpager与fragment的组合在项目中使用的频率太高,我们对Viewpager的两种的Adapter的处理方式略显不足加强一下认识。
先简单看看Fragment的两种Adapter的使用方式。
都是PagerAdapter的子类。
1:FragmentStatePagerAdapter2:FragmentPagerAdapter
当Viewpager.setAdapter(),Viewpager与PagerAdapter建立双向的联系。
1)Viewpager会拥有pagerAdapter的对象,能getAdapter获取到当前的Adapter。
2)mAdapter.setViewPagerObserver(new PagerObserver),至此得到adapter中的注册测,能向Viewpager传递数据。这样就算绑在一起了。
注意:调用pagerAdapter.notifDataSerChange()触发时,ViewPager.dataSetChanged()也会被调用。该函数使用Adapter中的getitemposition()返回值来进行判断。
一,PagerAdapter
这是我们常用两种Adapter的基类。这是一个abstract的,直接继承他的话我么需要重写方法
1)getItemPosition();
//instantiateItem()的返回值将有此函数的返回值进行判断,是否进行调用。
public static final int POSITION_UNCHANGED = -1; public static final int POSITION_NONE = -2;
如若不重写,默认返回POSITION_UNCHANGED,将不会调用Viewpager的observer.notifit()
因此,调用Adapter.notifyDataSetChanged()将不会出现什么改变。
//后面这三个方法,直接照着官方文档书写就行!
2)instantiateItem();
3) getCount();
4) isViewFromObject();
5) destroyItem();
二,FragmentStatePagerAdapter
/**
* FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter。
* 但和 FragmentPagerAdapter 不一样的是,
* 正如其类名中的 ‘State’ 所表明的含义一样,
* 该 PagerAdapter 的实现将只保留当前页面,
* 当页面离开视线后,就会被消除,释放其资源;
* 而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。
* 这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。
*/
重写方法:
1)getItem()
生成需要的Fragment的对象。Fragment.setArgument()这种只会在新建Fragment时执行一次的传递参数放在这里。
2)instantiateItem()
除非碰到FragmentManger刚好从Savedstate 中恢复了对应Fragment的情况外,都将调用getItem()来生成新的对象。
mFragmentManager.beginTransaction().add(container.getId(), fragment);
3)destoryItem()
将Fragment移除。
mFragmentManager.beginTransaction().remove(fragment);
三,FragmentPagerAdapter
/**
* 该类内的每一个生成的 Fragment 都将保存在内存之中,
* 因此适用于那些相对静态的页,数量也比较少的那种;
* 如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,
* 应该使用FragmentStatePagerAdapter。
*/
重写方法
1)getItem();
只会在第一次初始化的时候地调用,每次都会查找一下是否有当前Fragment生成过。生成了就不调用getItem的方法。
2)instantiateItem();
判断一下要生成的Fragment是否已经生成过了,如果生成了,调用mFragmentManager.beginTransaction().attch(fragment);
如果没有
mFragmentManager.beginTransaction().add(container.getId(), fragment,makeFragmentName(container.getId(), itemId));
3)destoryItem()
mFragmentManager.beginTransaction().detach()。
这里并不会remove(),因此Fragment还在Fragmentmanager管理中,Fragment所占用的资源不会释放。
上诉两个Adapter 对Fragment的生命周期的最大的不同 FragmentStatePagerAdapter是销毁重走所有生命走起 onAttach - onDetach
FragmentPagerAdapter 是从onCreateView - onDestroyView 然而成员不销毁,因此我们有些会出现一些数据错乱的时候。(这里我们可以判断当前的View是否已经加载过了)
if(rootView==null){ rootView=inflater.inflate(R.layout.tab_fragment, null); } //缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。 ViewGroup parent = (ViewGroup) rootView.getParent(); if (parent != null) { parent.removeView(rootView); }
四,生命周期的看法
这里重点说明一下:setUserVisibleHint 调用 在所有生命周期之前执行。每次Adapter切换都会调用相应的Fragment的此方法。
思路也就来了。 实现的思路很多种,仔细看这个生命周期,总结规律,这个懒加载也就现实了。
`public abstract class LazzyFragment extends Fragment {//判断控件是否加载完毕private boolean isCreateView = false;//判断是否已加载过数据public boolean isLoadData = false;/** * 返回layoutView * @param inflater * @param container * @return 初始化布局文件 */public abstract View getView(LayoutInflater inflater, ViewGroup container);/** * 初始化控件 */public abstract void initViews(View view);@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = getView(inflater, container); initViews(view); isCreateView = true; return view;}//注意,此方法再所有生命周期之前调用,不可操作控件@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isCreateView && !isLoadData) { loadData(); }}/** * 加载数据 */public void loadData() { //如果没有加载过就加载,否则就不再加载了 if (!isLoadData) { //加载数据操作 isLoadData = true; }}// 第一次进入ViewPager的时候我们需要直接加载,因为此时setUserVisibleHint 已经调用过了。@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getUserVisibleHint()) loadData();}
}`
- Fragment的Adapter分析及懒加载
- Fragment懒加载分析使用
- Fragment的懒加载
- Fragment的懒加载
- Fragment的懒加载
- Fragment 的懒加载
- Fragment 的懒加载
- Fragment 的懒加载
- Fragment 的懒加载
- fragment的懒加载
- Fragment的懒加载
- Fragment的懒加载
- Fragment的懒加载
- Fragment的懒加载
- Fragment懒加载的实现方法(含源码分析)
- AdapterView及Adapter分析
- fragment中如果有fragment嵌套viewpager,每次点击刷新及懒加载的解决方法
- Android之Fragment懒加载分析
- Java NIO 系列教程
- elasticsearch 查询(match和term)
- 如何实现微服务架构中的服务发现?
- volatile关键字的实现原理
- 使用android studio制作.9图
- Fragment的Adapter分析及懒加载
- 【ML--15】在R语言中使用决策树算法做多分类预测
- mybatis Example条件查询
- 计算机网络基础知识(一)
- 你不可不知道的 JavaScript 作用域和闭包
- ListView Item点击失效的原因及解决办法
- Spring Boot使用过滤器
- 带你玩转超级列表框(1-4)雪山灵狐
- Spring 之 AOP概念理解