viewpage里fragment懒加载与缓存已经创建的fragment
来源:互联网 发布:首届书法艺术网络大赛 编辑:程序博客网 时间:2024/05/16 20:29
以下内容来源于网络收集:
新闻类应该最常见的就是viewpage,Fragment.
懒加载的方式基本都是通过setUserVisibleHint的方式来判断当前的Fragment是不是可见,但是如果想只有第一次加载数据后面再显示不加载数据,就必须还要做一些其他的判断
下面直接看代码:
private boolean hasCreateView = false; private boolean isFragmentVisible; private boolean isFirstVisible;//setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false //如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true //如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false //总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调 //如果我们需要在 Fragment 可见与不可见时干点事,用这个的话就会有多余的回调了,那么就需要重新封装一个 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); //setUserVisibleHint()有可能在fragment的生命周期外被调用 if (!hasCreateView) { return; } if (isFirstVisible && isVisibleToUser) { onFragmentFirstVisible(); isFirstVisible = false; } if (isVisibleToUser) { onFragmentVisibleChange(true); isFragmentVisible = true; return; } if (isFragmentVisible) { isFragmentVisible = false; onFragmentVisibleChange(false); } } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { //如果setUserVisibleHint()在rootView创建前调用时,那么 //就等到View创建完后才回调onFragmentVisibleChange(true) //保证onFragmentVisibleChange()的回调发生在View创建完成之后,以便支持ui操作 if (!hasCreateView) { hasCreateView = true; if (getUserVisibleHint()) { hasCreateView = true; if (isFirstVisible) { onFragmentFirstVisible(); isFirstVisible = false; } onFragmentVisibleChange(true); isFragmentVisible = true; } } super.onViewCreated(view, savedInstanceState); } /** * 去除setUserVisibleHint()多余的回调场景,保证只有当fragment可见状态发生变化时才回调 * 回调时机在view创建完后,所以支持ui操作,解决在setUserVisibleHint()里进行ui操作有可能报null异常的问题 * * 可在该回调方法里进行一些ui显示与隐藏,比如加载框的显示和隐藏 * * @param isVisible true 不可见 -> 可见 * false 可见 -> 不可见 */ protected void onFragmentVisibleChange(boolean isVisible) { } /** * 在fragment首次可见时回调,可在这里进行加载数据,保证只在第一次打开Fragment时才会加载数据, * 这样就可以防止每次进入都重复加载数据 * 该方法会在 onFragmentVisibleChange() 之前调用,所以第一次打开时,可以用一个全局变量表示数据下载状态, * 然后在该方法内将状态设置为下载状态,接着去执行下载的任务 * 最后在 onFragmentVisibleChange() 里根据数据下载状态来控制下载进度ui控件的显示与隐藏 */ protected void onFragmentFirstVisible() { } protected boolean isFragmentVisible() { return isFragmentVisible; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initVariable(); } @Override public void onDestroy() { initVariable(); super.onDestroy(); } private void initVariable() { isFirstVisible = true; isFragmentVisible = false; hasCreateView = false; }
基本思路就是判断但是是不是已经view创建好了,是不是显示了,如果都是那就进行相应的回调
2.如果要进行Fragment的缓存就在adpter里进行数组保存,然后重写下面的方法
@Override public int getItemPosition(Object object) { return POSITION_NONE; }
这样每次加载Fragment的时候都会认为没有缓存需要调用getItem方法,这样就不会受viewPager 的 setOffscreenPageLimit影响,导致不会调用getItem方法
0 0
- viewpage里fragment懒加载与缓存已经创建的fragment
- ViewPage Fragment 懒加载
- ViewPage加载fragment
- 使用viewpage加载fragment
- 记录ViewPage+Fragment嵌套ViewPage+Fragment滑动时内部嵌套卡顿的问题和实现Fragment的懒加载
- Android中的Fragment+Viewpage懒加载
- FragmentTabHost+Fragment+Viewpage遇到的Fragment重复加载问题
- Fragment里嵌套Fragment,父fragment有缓存布局加载不出来的问题
- ViewPage+Fragment的使用
- Fragment + ViewPage的使用
- Viewpage + fragment 防止预加载
- viewpage+fragment禁止预加载
- ViewPage+Fragment取消预加载
- ViewPage+Fragment 懒加载+只加载一次 SwipeRefreshLayout自动刷新
- ViewPage,TabHost与Fragment(上)
- ViewPage,TabHost与Fragment(下)
- viewpage + fragment
- ViewPage+fragment
- StarCitizen星际公民账号注册教程
- ddos 常用八大命令
- HDU 3966 (树链剖分对点权值,模板)
- linux命令之eject
- 《深入理解Android 卷III》第三章 深入理解AudioService
- viewpage里fragment懒加载与缓存已经创建的fragment
- 一个跑不出结果的视图的优化
- Mysql PARTITION 数据表分区技术
- Nutch简介
- 快递鸟-各种电子面单_Api接口
- 查看已安装的CentOS版本信息
- ACM-二分贪心X-24
- 用extern定义全局变量
- Latex转word