美文网首页Android开发
RecyclerView加空白页

RecyclerView加空白页

作者: 程序员阿兵 | 来源:发表于2018-06-27 19:50 被阅读0次

    一 说明:

    项目中使用recyclerview的时候,经常会在数据列表空白页添加loding空白页面,显示一个特殊的empty view 来提示用户。

    二 实现思路

    阅读RecyclerView的源码,可以发现里面自带了一个数据观察者AdapterDataObserver用来监听数据的变化(代码在下面),所以我们自然想到了,自定义一个RecyclerView,重写里面的这个类,然后检查数据源的个数是否为0,当为空的时候,把我们先显示的EmptyView显示出来,这个和以前ListView相似。思路比较简单,直接看看代码是怎么实现的。

    源码中AdapterDataObserver类


    image.png

    自定义RecyclerView

    EmptyRecyclerView

    
        private View emptyView;
        private static final String TAG = "EmptyRecyclerView";
    
        final private AdapterDataObserver observer = new AdapterDataObserver() {
            @Override
            public void onChanged() {
                checkIfEmpty();
            }
    
            @Override
            public void onItemRangeInserted(int positionStart, int itemCount) {
                Log.i(TAG, "onItemRangeInserted" + itemCount);
                checkIfEmpty();
            }
    
            @Override
            public void onItemRangeRemoved(int positionStart, int itemCount) {
                checkIfEmpty();
            }
        };
    
        public EmptyRecyclerView(Context context) {
            super(context);
        }
    
        public EmptyRecyclerView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public EmptyRecyclerView(Context context, AttributeSet attrs,
                                 int defStyle) {
            super(context, attrs, defStyle);
        }
    
        private void checkIfEmpty() {
            if (emptyView != null && getAdapter() != null) {
                final boolean emptyViewVisible =
                        getAdapter().getItemCount() == 0;
                emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
                setVisibility(emptyViewVisible ? GONE : VISIBLE);
            }
        }
    
        @Override
        public void setAdapter(Adapter adapter) {
            final Adapter oldAdapter = getAdapter();
            if (oldAdapter != null) {
                oldAdapter.unregisterAdapterDataObserver(observer);
            }
            super.setAdapter(adapter);
            if (adapter != null) {
                adapter.registerAdapterDataObserver(observer);
            }
    
            checkIfEmpty();
        }
    
        //设置没有内容时,提示用户的空布局
        public void setEmptyView(View emptyView) {
            this.emptyView = emptyView;
            checkIfEmpty();
        }
    }
    

    重写AdapterDataObserver,每次数据变化都会调用onChanged(),所以就在这里检查数据源是否为空,看一下checkIfEmpty()方法,很简单,就是通过Adapter的getCount来判断时候数据为空,空就显示我们定义的EmptyView。
    最后在setAdapter的时候调用如下代码就可以了。

    image.png

    相关文章

      网友评论

        本文标题:RecyclerView加空白页

        本文链接:https://www.haomeiwen.com/subject/tgzbyftx.html