天天看点

打造适配RecyclerView的万能BaseAdapter

前言:上篇文章写了打造适配ListView的万能Adapter,有需要的请转:https://blog.csdn.net/fsx_xiaomei/article/details/88824907

,今天来打造适配RecyclerView的万能BaseAdapter。

一、一般写法

  • RecyclerActivity(需要注意的是,RecyclerView一定要setLayoutManager,否则运行程序不会出错,但是真个RecyclerView不展示)
public class RecyclerActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private List<Bean> mList;
    private LinearLayoutManager manager;
    private PersonRecyclerAdapter mAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler);
        mRecyclerView = findViewById(R.id.recycler);
        initData();
        initView();
    }

    private void initData() {
        mList = new ArrayList<>();
        mList.add(new Bean("xiaoming 1", "湖南省长沙市天心区", 18));
        mList.add(new Bean("xiaoming 2", "湖南省长沙市天心区", 18));
        mList.add(new Bean("xiaoming 3", "湖南省长沙市天心区", 18));
        mList.add(new Bean("xiaoming 4", "湖南省长沙市天心区", 18));
        mList.add(new Bean("xiaoming 5", "湖南省长沙市天心区", 18));
        mList.add(new Bean("xiaoming 6", "湖南省长沙市天心区", 18));
    }

    private void initView() {
        if (manager == null)
            manager = new LinearLayoutManager(this);
        if (mAdapter == null)
            mAdapter = new PersonRecyclerAdapter(this);
        mAdapter.setData(mList);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(mAdapter);
    }
}

           
  • PersonRecyclerAdapter
public class PersonRecyclerAdapter extends RecyclerView.Adapter<PersonRecyclerAdapter.ViewHolder> {

    private List<Bean> mData;
    private Context mContext;

    public void setData(List<Bean> mData) {
        this.mData = mData;
        this.notifyDataSetChanged();
    }

    public PersonRecyclerAdapter(Context mContext) {
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
        ViewHolder viewHolder = new ViewHolder(convertView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
        Bean bean = mData.get(position);
        if (bean != null) {
            viewHolder.tv_name.setText(bean.getName());
            viewHolder.tv_address.setText(bean.getAddress());
            viewHolder.tv_age.setText("年龄:" + bean.getAge());
        }
    }

    @Override
    public int getItemCount() {
        return (mData == null) ? 0 : mData.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView tv_name;
        public TextView tv_address;
        public TextView tv_age;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            tv_address = itemView.findViewById(R.id.tv_address);
            tv_age = itemView.findViewById(R.id.tv_age);
        }
    }
}
           
  • 实体类Bean(基础和万能Adapter都一样,这里就是使用的ListView使用过的bean)
public class Bean {
    private String name;
    private String address;
    private int age;
    ...//省略set,get和construct方法
}
           
  • xml布局(省略),运行效果和ListView显示效果一样
  • 运行效果
    打造适配RecyclerView的万能BaseAdapter

二、抽取ViewHolder,打造万能ViewHolder(因为写ListView时写了两个步骤,RecyclerView就直接写一个步骤了)

  • 新建CommonRecyclerViewHolder
public class CommonRecyclerViewHolder extends RecyclerView.ViewHolder {

    private View mItemView;
    private SparseArray<View> mViews;

    public CommonRecyclerViewHolder(@NonNull View itemView) {
        super(itemView);
        mViews = new SparseArray<>();
        this.mItemView = itemView;
    }

    public View getView(int viewId) {
        View view = mViews.get(viewId);
        if(view == null){
            view = mItemView.findViewById(viewId);
            mViews.put(viewId,view);
        }
        return view;
    }

    public CommonRecyclerViewHolder setText(int viewId,String text){
        ((TextView)getView(viewId)).setText(text);
        return this;
    }

    public CommonRecyclerViewHolder setImageResource(int viewId,int resId){
        ((ImageView)getView(viewId)).setImageResource(resId);
        return this;
    }
	//这里还可以根据项目需要添加很多方法
}
           
  • 修改PersonRecyclerAdapter
public class PersonRecyclerAdapter extends RecyclerView.Adapter<CommonRecyclerViewHolder> {

    private List<Bean> mData;
    private Context mContext;

    public void setData(List<Bean> mData) {
        this.mData = mData;
        this.notifyDataSetChanged();
    }

    public PersonRecyclerAdapter(Context mContext) {
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public CommonRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
        CommonRecyclerViewHolder viewHolder = new CommonRecyclerViewHolder(convertView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull CommonRecyclerViewHolder viewHolder, int position) {
        Bean bean = mData.get(position);
        if (bean != null) {
            viewHolder.setText(R.id.tv_name,bean.getName());
            viewHolder.setText(R.id.tv_address,bean.getAddress());
            viewHolder.setText(R.id.tv_age,"年龄:" + bean.getAge());
        }
    }

    @Override
    public int getItemCount() {
        return (mData == null) ? 0 : mData.size();
    }

}
           
  • 运行成功

三、打造万能CommonRecyclerAdapter(打造过程和ListView打造过程差不多,所以也就用一个步骤来写了)

  • 新建CommonRecyclerAdapter
public abstract class CommonRecyclerAdapter<T> extends RecyclerView.Adapter<CommonRecyclerViewHolder> {

    private List<T> mDatas;
    private int mLayoutId;
    private Context mContext;

    public void setDatas(List<T> datas) {
        this.mDatas = datas;
        this.notifyDataSetChanged();
    }

    public CommonRecyclerAdapter(int mLayoutId, Context mContext) {
        this.mLayoutId = mLayoutId;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public CommonRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View convertView = LayoutInflater.from(mContext).inflate(mLayoutId, null);
        return new CommonRecyclerViewHolder(convertView);
    }

    @Override
    public int getItemCount() {
        return (mDatas == null) ? 0 : mDatas.size();
    }

    @Override
    public void onBindViewHolder(@NonNull CommonRecyclerViewHolder commonRecyclerViewHolder, int i) {
        T bean = mDatas.get(i);
        convert(commonRecyclerViewHolder,i,bean);
    }

    public abstract void convert(CommonRecyclerViewHolder viewHolder,int position,T bean);
}

           
  • 修改PersonRecyclerAdapter
public class PersonRecyclerAdapter extends CommonRecyclerAdapter<Bean> {

    public void setData(List<Bean> data) {
        setDatas(data);
    }

    public PersonRecyclerAdapter(int layoutId, Context context) {
        super(layoutId, context);
    }

    @Override
    public void convert(CommonRecyclerViewHolder viewHolder, int position, Bean bean) {
        if (bean != null) {
            viewHolder.setText(R.id.tv_name,bean.getName());
            viewHolder.setText(R.id.tv_address,bean.getAddress());
            viewHolder.setText(R.id.tv_age,"年龄:" + bean.getAge());
        }
    }
}

           
  • 修改RecyclerActivity
if (mAdapter == null)
            mAdapter = new PersonRecyclerAdapter(R.layout.item_list,this);
           
  • 运行成功。

四、总结

  • 可以看到,做RecyclerView的万能Adapter和ListView是差不多的,只要弄清楚了一个另外一个就很好理解了
  • 代码地址: https://github.com/xiaomei888/baselistadapter/tree/master

继续阅读