Fragment实现懒加载

来源:互联网 发布:python 网络爬虫代码 编辑:程序博客网 时间:2024/06/05 03:48

引言

Fragment是目前使用最广泛的组件之一,作为轻量级的布局承载组件,只有当它和v4包的ViewPager结合才是Perfect。

在平常开发中,基本ViewPager中适配Fragment是必不可少的,然而当每个Fragment中的数据量大加载缓慢,在每个Fragment之间切换时将会不断地进行数据请求,对于ViewPager而言,他会默认加载当前可见的Fragment的前一个和后一个Fragment,这里ViewPager中有一个方法setOffscreenPageLimit(int limit)用来设置预加载的页面的数量,默认为1,所以只能设置预加载页面比一个多不能设置预加载为0。既然ViewPager无法改变,那就只有从Fragment中想办法了,这里fragment中有一个setUserVisibleHint(boolean isVisibleToUser)方法,该方法在onCreateView之前执行,我们看一下官方对该方法的解释:

Set a hint to the system about whether this fragment's UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore.An app may set this to false to indicate that the fragment's UI is scrolled out of visibility or is otherwise not directly visible to the user. This may be used by the system to prioritize operations such as fragment lifecycle updates or loader ordering behavior.

好了,我们就在这里下文章,在该方法中对传入的参数判断当前Fragment是否可见,不可见时,只创建视图但是不会加载数据,而且只加载一次。下面就是我封装的关于创建一个基类的Fragment,继承实现抽象方法就行了:

package com.example.luweicheng.lazyloadfragment.fragments;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by luweicheng on 2016/12/19. * 懒加载fragment基类 */public abstract class BaseFragment extends Fragment {    private static final String TAG = "BaseFragment";    private Boolean isVisible = false;//是否可见    private Boolean isCreateView = false;//是否UI创建完成    private Boolean isFirstLoad= true;//是否是第一次加载    private View convertView;  //fragment根View    private SparseArray<View> mViews;    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        convertView = inflater.inflate(getLayoutId(),null);        mViews = new SparseArray<>();        bindView(convertView);        isCreateView = true;        return convertView;    }    /**     * 绑定控件监听等操作     */    protected abstract void bindView(View convertView);    /**     * 返回布局id     * @return     */    protected abstract int getLayoutId();    /**     * 加载数据操作     *     */    protected abstract void loadData();    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(isVisibleToUser){            isVisible = true;        }else{            isVisible = false;            return;        }    }    @Override    public void onStart() {        super.onStart();        lazyLoadData();    }    /**     * 判断是否加载数据     */    private void lazyLoadData(){     if(isFirstLoad){         Log.e(TAG, "lazyLoadDta:第一次加载" );     }else{         Log.e(TAG, "lazyLoadDta: 不是第一次加载" );     }        Log.e(TAG, "lazyLoadData: "+isFirstLoad+isVisible+isCreateView );    if(!isFirstLoad||!isCreateView||!isVisible){        Log.e(TAG, "lazyLoadDta: 不加载" );        return;    }        Log.e(TAG, "lazyLoadDta: 完成数据的第一次加载" );        loadData();        isFirstLoad = false;    }}

这是Demo源码存放在GitHub点击查看

0 0
原创粉丝点击