登录不老阁

 
注册成功

二呆

diamond@tongleer.com

岂能尽如人意,但求无愧我心。

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

2017-6-11 二呆 Android 3679观看

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.

标签: Android ViewPager Fragment 预加载 Android实战开发

« 【Android】实战开发之获取设备各种唯一识别码的工具类 | 【Linux】服务器subversionSVN安装配置及windows客户端TortoiseSVN使用教程»

  • 觉得很赞 (1)
  • 打赏
  • X
    打赏
    • 微信
    • QQ红包
    • 支付宝


    用微信扫一扫

    您的鼓励将是站长及作者前行的动力,谢谢打赏
    (若二维码有误可举报)

发表评论:

快乐贰呆的关注更多 >

小草窝博客

博主是一名天朝的学生,喜欢折腾各种奇怪的语言,喜欢探索未知的事情

标签

Genymotion Button HTML 腾讯视频 Win10 火腿肠意面 MIUI 主题编辑器 Android emlog pjax EventBus AndroidStudio 快捷键 倒计时 工具类 eclipse javascript 励志语录 自定义Dialog Demo java 热伤风 redis RabbitMQ ZeroMQ ActiveMQ Kafka Jafka php 鸡蛋饼 直播 继承 面向对象 工厂模式 AutoCompleteTextView GridView RadioButton ToggleButton Android开发入门 EditText CheckBoxes 控件 TimePicker AnalogClock DigitalClock ProgressBar SeekBar RatingBar UI控件 Spinner ScrollView Adapter 单元测试 Dialog 自定义对话框 Android项目 布局 Android视频 Java4Android Android开发教程 学习札记 基本数据类型 运算符和流程控制 流程控制循环语句 数组 数组二 二维数组 安卓基础 安卓监听器 表格布局 帧布局 网格布局 Android异常 AndroidIO XML XML解析 用户登录 数据存储 SQLite内部数据存储 Unity3D教程 Linux subversionSVN TortoiseSVN ViewPager Fragment 预加载 Android实战开发 唯一识别码 锁屏 Activity CheckBox ListView 增删改查 图片回收处理 内存溢出 仿2列商品列表 AndroidNDK eclipse插件 jni开发 jni调用 so文件 Androidmk配置 Flash 绘制图形 苹果 图标 变形工具 滤镜 Flash特效 简单薄餐 Flash滤镜 Flash动画 Android开发 天气预报 醋溜白菜 香菇烩豆腐 微波豆腐蒸蛋 速成凉拌豆腐 杜子建 穷根 男装搭配 黄帝内经 大蒜洋葱粥 情商密码 中华药粥 交际红人 小白菜萝卜粥 每日一笑 完美国际 故梦 一卷情长 Ukulele 白熊音乐 零基础 指弹 教程 白桦树娃娃 新加坡 网红美食 海南鸡饭

公众号

同乐儿