2484天 Mr.贰呆

唯一自信的就是自己的人品。
寻求王者玩家一起开黑净化峡谷环境​​

【Android】实战开发之ViewPager+Fragment预加载问题完美解决

发布于 / 9578 次围观 / 0 条评论 / Android / 二呆 /

Android实战开发中,当我们使用ViewPager+Fragment的时候肯定知道Fragment会预先加载两侧Fragment的布局,如果有大量数据的话,会造成Fragment卡顿现象,所以这里说明一种Fragment缓加载的方式,相当简单,只要继承以下父类Fragment,再在对应方法中加载数据即可实现Fragment缓加载了,剩下的注释很清楚,如果你还想在缓加载基础上实现下拉刷新等功能,那就更好了。

一、父类BaseFragment

import android.support.v4.app.Fragment;
/**
 * 基础Fragment,子类Fragment都继承自它,尤其是ViewPager中的Fragment
 * 因为ViewPager+Fragment组合使用时会产生预先加载前后Fragment,若再加上比较大的数据量,就会造成卡顿的现象,
 * 为防止发生,可以在用户可见的时候加载数据,因此才会写一个BaseFragment
 * @author tongleer.com
 *
 */
public class BaseFragment extends Fragment{
    /**
     * 当前界面是否呈现给用户的状态标志
     */
    protected boolean isVisible;
    /** 
     * 重写Fragment父类生命周期方法,在onCreate之前调用该方法,实现Fragment数据的缓加载. 
     * @param isVisibleToUser 当前是否已将界面显示给用户的状态
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(getUserVisibleHint()) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInvisible();
        }
    }
    /**
     * 当界面呈现给用户,即设置可见时执行,进行加载数据的方法
     * 在用户可见时加载数据,而不在用户不可见的时候加载数据,是为了防止控件对象出现空指针异常
     */
    protected void onVisible(){
        setlazyLoad();
    }
    /**
     * 当界面还没呈现给用户,即设置不可见时执行
     */
    protected void onInvisible(){
    }
    /**
     * 加载数据方法
     */
    protected void setlazyLoad(){
    }
}
二、子类DemoPreloadFragment

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
 * 预加载Fragment例子
 * @author tongleer.com
 *
 */
public class DemoPreloadFragment extends BaseFragment{
    /**
     * 预加载标志,默认值为false,设置为true,表示已经预加载完成,可以加载数据
     */
    private boolean isPrepared;
    /**
     * Fragment生命周期方法,此view可改为自定义的布局
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(android.R.layout.activity_list_item, container, false);
        //TODO 此处初始化view中各个控件
        isPrepared = true;
        setlazyLoad();
        return view;
    }
    /**
     * 加载数据的方法,只要保证isPrepared和isVisible都为true的时候才往下执行开始加载数据
     */
    @Override
    protected void setlazyLoad() {
        super.setlazyLoad();
        if(!isPrepared || !isVisible) {
            return;
        }
        //TODO 此处填充view中各个控件的数据
    }
}
over.
sitemap