android自定义LoadPager页面,再也不用担心重复的代码啦

在网上找了很久,都没有找到自己想要的结果,所以自己就写了一个,并把它放到了github上,喜欢的朋友可以去下载源码看下。先上代码
public abstract class LoadPager extends FrameLayout {
    public static final int STATE_UNKOWN = 0;
    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_SUCCESS = 4;
    public int state = STATE_UNKOWN;

    private View loadingView;// 加载中的界面
    private View errorView;// 错误界面
    private View emptyView;// 空界面
    private View successView;// 加载成功的界面

    private Context mContext;

    public LoadPager(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public LoadPager(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
        init();
    }

    public LoadPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    private void init() {
        loadingView = createLoadingView(); // 创建了加载中的界面
        if (loadingView != null) {
            this.addView(loadingView, new FrameLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        errorView = createErrorView(); // 加载错误界面
        if (errorView != null) {
            this.addView(errorView, new FrameLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        emptyView = createEmptyView(); // 加载空的界面
        if (emptyView != null) {
            this.addView(emptyView, new FrameLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        showPage(STATE_LOADING);// 根据不同的状态显示不同的界面
    }

    // 根据不同的状态显示不同的界面
    public void showPage(int result) {
        state = result;
        if (loadingView != null) {
            loadingView.setVisibility(state == STATE_UNKOWN
                    || state == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);
        }
        if (errorView != null) {
            errorView.setVisibility(state == STATE_ERROR ? View.VISIBLE
                    : View.INVISIBLE);
        }
        if (emptyView != null) {
            emptyView.setVisibility(state == STATE_EMPTY ? View.VISIBLE
                    : View.INVISIBLE);
        }
        if (state == STATE_SUCCESS) {
            if (successView == null) {
                successView = createSuccessView();
                this.addView(successView, new FrameLayout.LayoutParams(
                        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
            }
            successView.setVisibility(View.VISIBLE);
        } else {
            if (successView != null) {
                successView.setVisibility(View.INVISIBLE);
            }
        }
    }

    /* 创建了空的界面 */
    private View createEmptyView() {
        return View.inflate(mContext, R.layout.loadpage_empty,
                null);
    }

    /* 创建了错误界面 */
    private View createErrorView() {
        View view = View.inflate(mContext, R.layout.loadpage_error,
                null);
        Button page_bt = (Button) view.findViewById(R.id.page_bt);
        page_bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                show();
            }
        });
        return view;
    }

    /* 创建加载中的界面 */
    private View createLoadingView() {
        return View.inflate(mContext,
                R.layout.loadpage_loading, null);
    }

    // 根据服务器的数据 切换状态
    public void show() {
        if (state == STATE_ERROR || state == STATE_EMPTY) {
            state = STATE_LOADING;
        }

        load();
        showPage(state);

    }

    /***
     * 创建成功的界面
     */
    public abstract View createSuccessView();

    /**
     * 请求服务器
     * 必须在请求完成后调用showPage方法
     */
    protected abstract void load();
}
	上面的注释都写的很清楚啦,如果对此类还不了解的朋友请在下面留言,看到后我将会回复你的。
	下面显示如何在基类中使用LoadPager,使得以后我们少写很多的代码。
<pre name="code" class="java">public abstract class BaseFragment extends Fragment{

    protected LoadPager mLoadPager = null;
    protected Context mContext = getActivity() == null ? APP.getInstance() : getActivity();

    protected ViewGroup mContainer;
    protected LayoutInflater mInflater;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mContainer = container;
        mInflater = inflater;
        if (mLoadPager == null){
            mLoadPager = new LoadPager(mContext) {
                @Override
                public View createSuccessView() {
                    return BaseFragment.this.createSuccessView();
                }

                @Override
                protected void load() {
                    BaseFragment.this.loadData();
                }
            };
        }

        return mLoadPager;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        show();
    }

    public void show(){
        if(mLoadPager!=null){
            mLoadPager.show();
        }
    }

    /**
     * 必须在获取到数据后调用checkData方法
     * */
    protected abstract void loadData();

    protected abstract View createSuccessView();

    /**校验数据 */
    protected void checkData(Object datas) {
        if(datas==null){
            mLoadPager.showPage(LoadPager.STATE_ERROR);//  请求服务器失败
        }else{
            try {
                @SuppressWarnings("unchecked") List<Object> ds = (List<Object>) datas;
                if(ds.size()==0){
                    mLoadPager.showPage(LoadPager.STATE_EMPTY);
                }else{
                    mLoadPager.showPage(LoadPager.STATE_SUCCESS);
                }
            } catch (Exception e) {
                e.printStackTrace();
                if("".equals(datas)){
                    mLoadPager.showPage(LoadPager.STATE_EMPTY);
                }else{
                    mLoadPager.showPage(LoadPager.STATE_SUCCESS);
                }
            }
        }

    }
}
下面来看看我们在子类中如何使用
</pre><pre code_snippet_id="1677905" snippet_file_name="blog_20160510_8_2136022" name="code" class="java"><pre name="code" class="java">public class ErrorFragment extends BaseFragment {
    private String str = "加载成功啦";
    @Override
    protected void loadData() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    APP.getMainThreadHandler().post(new Runnable() {
                        @Override
                        public void run() {
                            checkData(null);
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    @Override
    protected View createSuccessView() {
        TextView tv = new TextView(mContext);
        tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
        tv.setText(str);
        return tv;
    }
}

这里使用线程是为了模拟在网络中请求数据的耗时操作。


	好了,基本就是这样了,如果您代码不够好,有什么好的想法可以给我留言或者加我QQ347402035,请填写理由,否则可能会添加失败。

时间: 2024-10-02 21:38:40

android自定义LoadPager页面,再也不用担心重复的代码啦的相关文章

android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题!

ndroid-Easy-MultiDex 项目地址:TangXiaoLv/Android-Easy-MultiDex 简介:Android 傻瓜式 MultiDex 插件,从此再也不用担心方法数问题! 注 1:不想看前半部分的话可以直接跳过到最下面配置部分.注 2:本插件是基于DexKnifePlugin 1.5.6优化改造而来,感谢 ceabie 的无私奉献. 填坑之路 坑 1:65536 ,So easy! 原因:Dalvik 的 invoke-kind 指令集中,method refere

Xcode7的发布后的crash跟踪,轻松定位崩溃代码 Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS

Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BAD_ACCESS一直是很多开发者的噩梦,因为这个错误很不直观,出现后往往要花很长时间才能定位到错误.苹果这次带来了革命性的提升. 在项目的Scheme中Diagnostics下,选中enable address sanitizer(注意选中后Xcode会重新编译整个项目). 这样设置后,如果再出现类

Matlab命令合集 妈妈再也不用担心我不会用matlab了

matlab命令 一.常用对象操作:除了一般windows窗口的常用功能键外.1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看.2.who 可以查看当前工作空间变量名, whos 可以查看变量名细节.3.功能键:功能键 快捷键 说明方向上键 Ctrl+P 返回前一行输入方向下键 Ctrl+N 返回下一行输入方向左键 Ctrl+B 光标向后移一个字符方向右键 Ctrl+F 光标向前移一个字符Ctrl+方向右键 Ctrl+R 光标向右移一个字符Ctrl+方向左键 Ctr

完全免费,再也不用担心转pdf文件乱来乱去的问题了

完全免费,再也不用担心转pdf文件乱来乱去的问题了. 源代码:https://github.com/xlgwr/WpsToPdf.git 第三方插件Bye Bye... 功能说明 主要引用Wps金山办公软件生成pdf功能 可部署到IIS服务器,直接调用API,生成PDF文件 可转文件类型,xls,xlsx,ppt,pptx,doc,docx等Wps金山办公软件所有支持的文件类型. 安装最新Wps 金山办公软件 引用Wps 对应com dll 使用VS2019 打开,生成,运行 web api 发

妈妈再也不用担心我找不到文件了---find

1.find vs locate 在实际中,我们经常需要查找到一些特定文件,然后进行处理,LINUX提供了locate , find这两个命令用于文件查找. a.locate,非实时查找,非精确查找.linux会定期生成更新文件数据库,而locate将根据文件数据库进行查找.我们可以在使用locate命令前,更新文件数据库,使用updatedb即可.但是updatedb将会花费可能半天时间,SO LONG! b.find , 实时查找,精确查找.根据指定路径,查找标准,进行文件遍历(包括隐藏文件

Swift详解之四-------妈妈再也不用担心我的闭包了

妈妈再也不用担心我的闭包了 注:本文为作者自己总结,过于基础的就不再赘述 ,都是亲自测试的结果.如有错误或者遗漏的地方,欢迎指正,一起学习. swift中闭包是一个很强大的东西,闭包是自包含的函数代码块,可以在代码中被传递和使用.跟C 和 Objective-C 中的代码块(blocks)很相似 .这个大家必须掌握!必须掌握!必须掌握!重要的事情要说三遍 闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.下面我们就来攻克它! 1.闭包函数

利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了

前几天,修电脑主析就捣鼓刷BIOS,结果刷完黑屏开不了机,立刻意识到完了,BIOS刷错了.就从网上查资料,各种方法试了个遍,什么用处都没有.终于功夫不负有心人,找到了编码器,知道了怎么用.下面看看具体用法: 先买了一个便宜点的编码器: <ignore_js_op> 把刷错的BIOS芯片先拆下来:<ignore_js_op> 把芯片放到编码器上: 再找一台电脑,我的笔记本派上用场了,下载编码器的驱动程序和编码器软件:  <ignore_js_op> <ignore_

SharePoint自定义程序页面部署 不用重启IIS

SharePoint的部署方式默认是部署WSP包,尤其是有多个前端的时候WSP包的部署显得非常方便和快捷,但是WSP的部署需要重启整个IIS服务会造成SharePoint站点一段时间不能访问.结合自己项目的情况这里我们提出文件对考的方式来替代WSP包的部署.这里有两个地方需要注意: 1. 我们的SharePoint项目不会影响SharePoint内容数据库: 2. IIS不重启,但是SharePoint站点对应的应用程序池会自动回收 这里我们以一个demo来做说明: 如图我们的SharePoin

妈妈再也不用担心我js跨域了。。

$.getJSON('http://www.example.com/?aa=bb&callback=?', function(r){ console.log(r) }); //callback=?参数带上,妈妈再也不用担心我跨域了.jquery的getJSON利用的也是JSONP的原理去实现的.