RecycleView设置空数据视图

自RecycleView出现以来依靠着使用的灵活和功能的强大备受广大Android程序员的喜爱,相信在各位小伙伴们的项目中更是屡见不鲜。在项目中我们经常会遇到这种情况:从服务器获取数据后,若数据不为空则通过RecycleView展示,若为空则显示空数据的展位图。RecycleView不像ListView一样可以用

listview.setEmptyView(EmptyView) 方法设置布局,所以需要我们自己来实现,这是一个很简单的功能,每位小伙伴们肯定都有自己的解决方案。

比如最简单快速的实现就是直接在xml布局里面搭件RecycleView和空数据布局 进行动态的隐藏显示:




    

    

当然网上的大牛们都纷纷介绍了自己的技巧供我们学习

这里我分享一下我所常用的方法是通过装饰者模式将RecycleView适配器进行再封装,先贴上我的代码

activity_recycle.xml



    

        

EmptyAdapter.java

package com.example.recycleviewdemo;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by dh on 2018/6/15.
 */

public class EmptyAdapter extends RecyclerView.Adapter {

    private RecyclerView.Adapter mAdapter; //需要装饰的Adapter
    private Context mContext;
    private final int EMPTY_VIEW = 0;
    private final int NOT_EMPTY_VIEW = 1;

    public EmptyAdapter(RecyclerView.Adapter adapter, Context context) {
        mAdapter = adapter;
        mContext = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //展示空视图或者调用传入adapter方法
        if(viewType==EMPTY_VIEW){
            return new EmptyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.layout_empty,parent,false));
        }
        return mAdapter.onCreateViewHolder(parent,viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof EmptyViewHolder){
            return;
        }
        mAdapter.onBindViewHolder(holder,position);
    }

    @Override
    public int getItemCount() {
        //获取传入adapter的条目数,没有则返回 1
        if(mAdapter!=null){
            if(mAdapter.getItemCount()>0){
                return mAdapter.getItemCount();
            }
        }
        //位空视图保留一个条目
        return 1;
    }

    @Override
    public int getItemViewType(int position) {
        //根据传入adapter来判断是否有数据
        if(mAdapter!=null){
            if(mAdapter.getItemCount()>0){
                return NOT_EMPTY_VIEW;
            }
        }
        return EMPTY_VIEW;
    }

    public void notifyAdapter() {
        //有些时候数据的变化不仅要刷新当前adapter还要刷新传入的原始adapter
//        if(mAdapter!=null){
//            mAdapter.notifyDataSetChanged();
//        }
        notifyDataSetChanged();
    }

    class EmptyViewHolder extends RecyclerView.ViewHolder{

        public EmptyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

用起来也是很方便只需要传入已经构建好的RecycleAdapter就可以

RecycleActivity.java

package com.example.recycleviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class RecycleActivity extends Activity {
    private RecyclerView mRecycleList;

    private List mDatas = new ArrayList<>();
    private EmptyAdapter mEmptyAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycle);
        mRecycleList = (RecyclerView) findViewById(R.id.recycle_list);
        mRecycleList.setLayoutManager(new LinearLayoutManager(this));
        //构建EmptyAdapter传入自己RecycleAdapter
        mEmptyAdapter = new EmptyAdapter(new MyRecycleAdapter(this, mDatas),this);
        mRecycleList.setAdapter(mEmptyAdapter);
    }

    public void reset(View view) {
        getData();
        mEmptyAdapter.notifyAdapter();
    }

    public void clear(View view) {
        if(mDatas!=null&&mDatas.size()>0){
            mDatas.clear();
            mEmptyAdapter.notifyAdapter();
        }
    }

    public List getData(){
        if (mDatas==null) {
            mDatas = new ArrayList<>();
        }
        for (int i = 0; i < 20; i++) {
            mDatas.add("测试数据"+i);
        }
        return mDatas;
    }
}

效果:

RecycleView设置空数据视图_第1张图片

实现还是挺简单的,希望能给小伙伴们带来参考价值



你可能感兴趣的:(RecycleView设置空数据视图)