zoukankan      html  css  js  c++  java
  • Android 自定义通用的loadingview

    介绍

    好久没有写博客啦,最近在接近新年了,年前的工作都要收尾,所以特别忙,周末抽空写了个通用的加载view,写篇博客分享出来。

    功能

    1、显示加载视图,加载失败的时候显示加载失败视图,数据为空时显示数据为空视图,支持为失败视图设置点击事件重新加载数据。

    2、支持个性化设置,自定义设置 加载、失败、空数据视图。

    先放一张效果图压压惊

    这里写图片描述

    实现

    实现思路其实就是一个FrameLayout里添加三个布局做处理显示隐藏,自定义视图其实就是替换里面的view ,代码比较简单,如果直接看过我的自定义view系列文章,或者对自定义view有所了解,都很容易看懂,所有直接上代码了。

    具体代码

    java 代码

    public class CommonLoadingView extends FrameLayout {
    
    
        //加载时显示文字
        protected TextView mLoadingTextTv;
        public Context mContext;
        //加载错误视图
        protected LinearLayout mLoadErrorLl;
        //加载错误点击事件处理
        private LoadingHandler mLoadingHandler;
        //加载view
        private View loadingView;
        //加载失败view
        private View loadingErrorView;
        //数据为空
        private View emptyView;
    
    
        public CommonLoadingView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public CommonLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            mContext = context;
        }
    
        public void setLoadingHandler(LoadingHandler loadingHandler) {
            mLoadingHandler = loadingHandler;
        }
    
        public void setLoadingErrorView(View loadingErrorView) {
            this.removeViewAt(1);
            this.loadingErrorView = loadingErrorView;
            this.loadingErrorView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mLoadingHandler != null) {
                        mLoadingHandler.doRequestData();
                        CommonLoadingView.this.load();
                    }
                }
            });
            this.addView(loadingErrorView,1);
        }
    
        public void setLoadingView(View loadingView) {
            this.removeViewAt(0);
            this.loadingView = loadingView;
            this.addView(loadingView,0);
        }
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            loadingView = inflate(mContext, R.layout.common_loading_view, null);
            loadingErrorView = inflate(mContext, R.layout.network_layout, null);
            emptyView = inflate(mContext, R.layout.empty_layout, null);
            this.addView(loadingView);
            this.addView(loadingErrorView);
            this.addView(emptyView);
            loadingErrorView.setVisibility(GONE);
            emptyView.setVisibility(GONE);
            initView(this);
        }
    
    
        public void setMessage(String message) {
            mLoadingTextTv.setText(message);
        }
    
    
        private void initView(View rootView) {
            mLoadingTextTv = (TextView) rootView.findViewById(R.id.loading_text_tv);
            mLoadErrorLl = (LinearLayout) rootView.findViewById(R.id.load_error_ll);
            mLoadErrorLl.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mLoadingHandler != null) {
                        CommonLoadingView.this.load();
                        mLoadingHandler.doRequestData();
                    }
                }
            });
        }
    
        public void load(){
            loadingView.setVisibility(VISIBLE);
            loadingErrorView.setVisibility(GONE);
            emptyView.setVisibility(GONE);
        }
    
        public void load(String message){
            mLoadingTextTv.setText(message);
            loadingView.setVisibility(VISIBLE);
            loadingErrorView.setVisibility(GONE);
            emptyView.setVisibility(GONE);
        }
    
    
        public void loadSuccess(){
            this.loadSuccess(false);
        }
    
        public void loadSuccess(boolean isEmpty){
            loadingView.setVisibility(GONE);
            loadingErrorView.setVisibility(GONE);
            if (isEmpty) {
                emptyView.setVisibility(VISIBLE);
            }else{
                emptyView.setVisibility(GONE);
            }
        }
    
    
        public void loadError(){
            loadingView.setVisibility(GONE);
            loadingErrorView.setVisibility(VISIBLE);
        }
    
    
        public interface LoadingHandler{
            void doRequestData();
        }
    }
    
    

    使用

    基本使用

    几个基本的 load loadError loadSucccess方法的使用。

    public class DefaultViewActivity extends AppCompatActivity {
    
        protected ListView mListView;
        protected CommonLoadingView mLoadingView;
        private List<String> mList = new ArrayList<>();
        ArrayAdapter adapter;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_default_view);
            initView();
        }
    
        private void initView() {
            mListView = (ListView) findViewById(R.id.listView);
            mLoadingView = (CommonLoadingView) findViewById(R.id.loadingView);
            mLoadingView.load();
    
            //设置点击错误视图重新加载事件
            mLoadingView.setLoadingHandler(new CommonLoadingView.LoadingHandler() {
                @Override
                public void doRequestData() {
                    mLoadingView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 1; i <=20 ; i++) {
                                mList.add(i+"");
                            }
                            adapter = new ArrayAdapter(DefaultViewActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, mList);
                            mListView.setAdapter(adapter);
                            mLoadingView.loadSuccess(false);
                        }
                    },2500);
                }
            });
    
            //模拟网络错误,加载失败
            mLoadingView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mLoadingView.loadError();
                }
            },2500);
    
    
        }
    }
    

    自定义视图 使用

    只需要把自己自定义的view调用set方法设置进去即可。

    this.mLoadingView.setLoadingView(loadingView);
    
    this.mLoadingView.setLoadingErrorView(loadingErrorView);
    
    public class CustomViewActivity extends AppCompatActivity {
    
        protected ListView mListView;
        protected CommonLoadingView mLoadingView;
        private List<String> mList = new ArrayList<>();
        ArrayAdapter adapter;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_default_view);
            initView();
        }
    
        private void initView() {
            mListView = (ListView) findViewById(R.id.listView);
            mLoadingView = (CommonLoadingView) findViewById(R.id.loadingView);
    
    
            //设置自定义视图
            ProgressBar progressBar = new ProgressBar(this);
            this.mLoadingView.setLoadingView(progressBar);
            TextView textView = new TextView(this);
            textView.setText("加载失败...");
            this.mLoadingView.setLoadingErrorView(textView);
    
            mLoadingView.load();
    
            //设置点击错误视图重新加载事件
            mLoadingView.setLoadingHandler(new CommonLoadingView.LoadingHandler() {
                @Override
                public void doRequestData() {
                    mLoadingView.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 1; i <=20 ; i++) {
                                mList.add(i+"");
                            }
                            adapter = new ArrayAdapter(CustomViewActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, mList);
                            mListView.setAdapter(adapter);
                            mLoadingView.loadSuccess(false);
                        }
                    },2500);
                }
            });
    
            //模拟网络错误,加载失败
            mLoadingView.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mLoadingView.loadError();
                }
            },2500);
        }
    }
    

    至于具体的布局和样式文件就不贴了,主要是实现思路,代码

    下载请参考源码下载 ,记得点赞哟!

  • 相关阅读:
    Unity 5.3 Assetbundle热更资源
    自定义协同程序:CustomYieldInstruction
    C# 温故而知新: 线程篇(四)
    C# 温故而知新: 线程篇(三)
    C# 温故而知新: 线程篇(二)
    c# 温故而知新: 线程篇(一)
    C# 温故而知新:Stream篇(六)
    C# 温故而知新:Stream篇(七)
    C# 温故而知新:Stream篇(四)
    Redis高级数据类型
  • 原文地址:https://www.cnblogs.com/yangqiangyu/p/6321988.html
Copyright © 2011-2022 走看看