【BaseFragment】:

  1. public abstract class BaseFragment extends Fragment {
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    private LoadingPage loadingPage;
    private ViewGroup container;
    public boolean isInViewPager=false;//继承的Fragment是否存在于ViewPager中
    //默认为false,如果fragment不是在viewpager中它的setUserVisibleHint方法不会执行,默认不可见
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    private int isLoad=0;//是否已经加载过
    private boolean isVisable;//是否可见
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
    savedInstanceState) {
    this.container=container;
    loadingPage=updateLoadingPage();
    return loadingPage;
    }
  2.  
  3. /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    public LoadingPage updateLoadingPage(){
    loadingPage=new LoadingPage(container.getContext()) {
    @Override
    public int getMyLayoutId() {
    return getLayoutId();
    }
  4.  
  5. @Override
    public RequestParams getMyParams() {
    return getParams();
    }
  6.  
  7. @Override
    public String getMyUrl() {
    //如果Fragment不在ViewPager里,直接返回url
    if(!isInViewPager){
    return getUrl();
    }
    //如果Fragment在ViewPager里,需要分情况考虑
    if(TextUtils.isEmpty(getUrl())){//本身就不需要联网
    isLoad=1;
    return getUrl();
    }else{
    if(isVisable){//需要联网,可见
    isLoad=2;
    return getUrl();
    }else{//需要联网,不可见
    isLoad=3;
    return null;
    }
    }
  8.  
  9. }
  10.  
  11. @Override
    public void onMySuccess(ReSultState reSultState, View successView) {
    ButterKnife.bind(BaseFragment.this, successView);//绑定操作,第1个参数注意不能为this
    initTitle();
    initData(reSultState.getContent());
    }
  12.  
  13. };
    return loadingPage;
  14.  
  15. }
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
  16.  
  17. @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    showLodingPage();
    //为什么不直接写loadingPage.show()而要用方法showLodingPage()封装这句代码?
    //因为showLodingPage()方法,可以使得BaseFragment的继承者都可以调用
    //homeFragment=new HomeFragment();不会调用BaseFragment的onCreateView方法
    //在commit()之后,Fragment的生命周期onCreateView才会执行
    }
  18.  
  19. /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    public void showLodingPage(){
    loadingPage.show();//联网操作——>改变联网状态——>替换掉正在加载的页面
  20.  
  21. //模拟联网耗时操作,正常情况下用上面这句代码即可
    // UIUtils.getHandler().postDelayed(new Runnable() {
    // @Override
    // public void run() {
    // loadingPage.show();
    // }
    // },2000);
  22.  
  23. //还可以在LoadingPage的show()方法模拟联网耗时操作
  24.  
  25. }
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    @Override
    public void onDestroyView() {
    super.onDestroyView();
    ButterKnife.unbind(this);
    }
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    public abstract RequestParams getParams();
    public abstract String getUrl();
    public abstract int getLayoutId();
    public abstract void initTitle();
    public abstract void initData(String content);
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    //处理ViewPager的每页是继承于BaseFragment的Fragment,预加载的情况
    //最终实现的目标:取消ViewPager的预加载+缓存所有加载过的
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    isVisable=isVisibleToUser;
    if(isInViewPager && isVisibleToUser && isLoad==3){
    loadingPage.show();//这时候loadingPage一定不为null,因为isLoad==3表示已经初始化过
    }
    }
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    }

【LoadingPage】:

  1. public abstract class LoadingPage extends FrameLayout {
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    private Context mContext;
  2.  
  3. public static final int STATE_LOADING=1;
    public static final int STATE_ERROR=2;
    public static final int STATE_EMPTY=3;
    public static final int STATE_SUCESS=4;
  4.  
  5. public int state_current=STATE_LOADING;
  6.  
  7. private View loadingView;
    private View errorView;
    private View emptyView;
    private View successView;
  8.  
  9. private LayoutParams params;
  10.  
  11. /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    public LoadingPage(Context context) {
    this(context, null);
    }
  12.  
  13. public LoadingPage(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    }
  14.  
  15. public LoadingPage(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.mContext=context;
    init();
    }
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    private void init() {
    params=new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    if(loadingView==null){
    loadingView= UIUtils.getXmlView(R.layout.page_loading);
    addView(loadingView,params);
    }
    if(errorView==null){
    errorView= UIUtils.getXmlView(R.layout.page_error);
    addView(errorView);
    }
    if(emptyView==null){
    emptyView= UIUtils.getXmlView(R.layout.page_empty);
    addView(emptyView);
    }
    showSafePage();
    }
  16.  
  17. /**
    * 保证View的显示在主线程中执行
    */
    private void showSafePage() {
    UIUtils.runOnUiThread(new Runnable() {
    @Override
    public void run() {
    showPage();
    }
    });
    }
  18.  
  19. private void showPage() {
    loadingView.setVisibility(state_current==STATE_LOADING?VISIBLE:GONE);
    errorView.setVisibility(state_current==STATE_ERROR?VISIBLE:GONE);
    emptyView.setVisibility(state_current==STATE_EMPTY?VISIBLE:GONE);
    if(successView==null){
    successView=View.inflate(mContext,getMyLayoutId(),null);//Context:使用Fragment依赖的Activity实例
    addView(successView,params);
    }
    successView.setVisibility(state_current==STATE_SUCESS?VISIBLE:GONE);
    }
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    private AsyncHttpClient client=new AsyncHttpClient();//联网工具
    private ReSultState reSultState;//封装联网状态和数据的对象
    public void show(){
    //处理有些Fragment本身就不需要联网请求数据的情况,即该Fragment重写的getUrl方法直接return null
    String url=getMyUrl();
    if(TextUtils.isEmpty(url)){
    state_current=STATE_SUCESS;
    reSultState=ReSultState.SUCCESS;
    reSultState.setContent("");
    //这里将content设为"",那么在比如HomeFragment的initData一定要判断content是否为空
    loadPage();
    return;
    }
    //处理有些Fragment需要联网请求数据的情况,这时候该Fragment的getUrl()返回的是一个url
    Runnable runnable=new Runnable() {
    @Override
    public void run() {
    /*-------------------------------------------------------------------*/
    //正常情况下的代码
    AsyncHttpResponseHandler responseHandler=new AsyncHttpResponseHandler(){
    @Override
    public void onSuccess(String content) {//联网请求数据成功
    //content="";//模拟请求数据为空
    if(TextUtils.isEmpty(content)){
    reSultState=ReSultState.EMPTY;
    reSultState.setContent("");
    }else{
    reSultState=ReSultState.SUCCESS;
    reSultState.setContent(content);
    }
    loadPage();
    }
    @Override
    public void onFailure(Throwable error, String content) {//联网请求数据失败
    reSultState=ReSultState.ERROR;
    reSultState.setContent("");
    loadPage();
    }
    };
    client.get(getMyUrl(),getMyParams(),responseHandler);//getMyUrl(),getMyParams()由BaseFragment实现
    /*-------------------------------------------------------------------*/
    }
    };
    UIUtils.getHandler().post(runnable);
    //UIUtils.getHandler().postDelayed(runnable, 2000);//模拟延时2秒,正常代码没有这个
    }
  20.  
  21. /**
    * 根据resultState的状态和数据,更新当前加载状态state_current,如果是联网请求成功还需要
    * 调用抽象方法onSuccess(resultState,content),在BaseFragment会实现这个抽象方法,
    * 从而根据联网成功的数据加载页面
    */
    private void loadPage() {
    switch (reSultState) {
    case SUCCESS:
    state_current=STATE_SUCESS;
    break;
    case ERROR:
    state_current=STATE_ERROR;
    break;
    case EMPTY:
    state_current=STATE_EMPTY;
    break;
    }
  22.  
  23. showSafePage();
  24.  
  25. if(state_current==STATE_SUCESS){
    onMySuccess(reSultState,successView);
    }
    }
  26.  
  27. /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    /**
    * 封装联网状态和请求结果的枚举类
    */
    public enum ReSultState{
    ERROR(2),EMPTY(3),SUCCESS(4);
    private int state;
    private String content;
    ReSultState(int state) {
    this.state=state;
    }
    public String getContent() {
    return content;
    }
    public void setContent(String content) {
    this.content = content;
    }
    }
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
    // 抽象方法
    public abstract int getMyLayoutId();
    public abstract RequestParams getMyParams();
    public abstract String getMyUrl();
    public abstract void onMySuccess(ReSultState reSultState,View successView);
    /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
  28.  
  29. }

抽取的BaseFragment和LoadingPage的更多相关文章

  1. ViewPager的刷新、限制预加载、缓存所有

    [框架]: 公共部分:左侧菜单.TitleBar.RadioGroup(3个RadioButton:X.Y.Z) 选择X页面:指示器+ViewPager [要达成的效果]: (1)左侧选择A,进入X页 ...

  2. Android主页Activity对多个Fragment实现不同的沉浸式标题(图片或者文字标题)

    提示:讲解的该例实现是 FragmentTabHost + Fragment 实现: 1.示例效果图: 2.场景需求: 如示例图所示,在首页实现轮播图的沉浸,而 “发现” 和“我的”页是标题的沉浸. ...

  3. 高效抽取loading,再多的载入页面也不怕

    当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上.但假设页面特别的多.就每一个页面都要载入数据,就要写 loading 页面.我之前就是用dialog写,抽取出来一个类.哪里 ...

  4. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...

  5. 写个Fragment方便的抽象基类 BaseFragment

    package com.zb.zhihuianyang.base; import android.app.Activity; import android.os.Bundle; import andr ...

  6. TODO:从数据库中随机抽取一条记录

    TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...

  7. 【NLP】Tika 文本预处理:抽取各种格式文件内容

    Tika常见格式文件抽取内容并做预处理 作者 白宁超 2016年3月30日18:57:08 摘要:本文主要针对自然语言处理(NLP)过程中,重要基础部分抽取文本内容的预处理.首先我们要意识到预处理的重 ...

  8. SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等

    在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...

  9. Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)

      1.前言 昨天谈了BaseActivity的封装,Android谈谈封装那些事--BaseActivity和BaseFragment(一)有很多小伙伴提了很多建议,比如: 通用标题栏可以自定义Vi ...

随机推荐

  1. salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解

    建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema Builder查看表结构以及多表之间的关联关系,可以登录后点击setup在左侧搜索框输入schema ...

  2. JavaScript对浏览器的URL进行编码、解码

    关于url编码,js有三个函数.有三个解码方法,escape,encodeURI,encodeURIComponent().有三个解码方法,unescapse,decodeURI,decodeURIC ...

  3. MySQL(二) 数据库数据类型详解

    序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过 ...

  4. 深入理解PHP内核(二)概览-PHP生命周期与Zend引擎

    本文参考自<深入理解PHP内核>,地址:https://github.com/reeze/tipi 本文链接:http://www.orlion.ml/232/ 1.SAPI接口 SAPI ...

  5. jsp实现简单的分页

    效果如下:<%-- Document : page Created on : 2014-11-18, 8:55:02 Author : HJZ --%> <%@page conten ...

  6. hdu 1241 Oil Deposits (一次dfs搞定有某有)

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...

  7. sqlserver -- 解决sqlserver2008“Prevent saving changes that require table re_creation(阻止保存要求重新创建表的更改)”的问题

    电脑重装了sqlserver2008 R2(英文版)后,新建数据表,新建字段,发现有个字段类型设置错了,想修改字段类型,而该表已经保存好了,即保存后修改字段属性.但无法保存修改后的设置,提示“Savi ...

  8. sqlserver -- 学习笔记(八)体验charindex、stuff 和 for xml path在实际问题中的应用及几个问题的探讨

    写在前面 之前做了个微信端顾客扫码评价员工的功能,除了打分数,还可以打标签. 需要统计分数和统计各个员工每种标签被点击的次数. 后来加了个要求,需要查看客户对某个员工一次服务所打出的标签组合.  在不 ...

  9. 2014PPTV-题解

    今天在看PPTV几道题目,顺便联系起红宝书<JavaScript高级程序设计>一起看了起来. 1. var msg = 'hello';//顶级作用域windwo下有个变量msg func ...

  10. Dapper的基本使用

    Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的.也就是说实体类都要自己写.它没有复杂的配置文件,一个单文件就可 ...