写个万能adapter

294 阅读2分钟

写在前面的废话

以前写过一个databind的adapter,吹牛说再也不用写adapter和viewholder了,遗憾的是限制比较大,比较坑。后来一直想写一个万能的adapter,本意就是不想写adapter了。今天写了一个,个人感觉还能用吧,没啥限制,只是viewholder还是要写的。没有啥营养的废话就这样吧,先来看看怎么用的吧,不喜欢的可以赶紧撤,不浪费大家时间。哈哈

`       recycler = findViewById(R.id.recycler);
        List<BaseType> iTypeList = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            StudentInfo studentInfo_one = new StudentInfo("张三", "10", "url");
            iTypeList.add(BaseType.addType(R.layout.item_one, studentInfo_one));

            StudentInfo studentInfo_two = new StudentInfo("张三", "10", "url");
            iTypeList.add(BaseType.addType(R.layout.item_two, studentInfo_two));
        }
        BaseRecyclerAdapter adapter = new BaseRecyclerAdapter(this, iTypeList);
        adapter.createViewHolderFactory(new ViewHolderFactory() {
            @Override
            public BaseRecyclerViewHolder getViewHolder(int viewType, View itemView) {
                BaseRecyclerViewHolder baseRecyclerViewHolder = null;
                switch (viewType) {
                    case R.layout.item_one:
                        baseRecyclerViewHolder = new OneHolder(itemView);
                        break;
                    case R.layout.item_two:
                        baseRecyclerViewHolder = new TwoHolder(itemView);
                        break;
                }
                return baseRecyclerViewHolder;
            }
        });
        recycler.setLayoutManager(new LinearLayoutManager(this));
        recycler.setAdapter(adapter);

介绍

上面这是一个多类型的recyclerview的写法,我们先来简单的介绍下流程

  1. findView就不说啦
  2. 创建数据集合
List<BaseType> iTypeList = new ArrayList<>();
  1. 填充数据集合
 ·      for (int i = 0; i < 30; i++) {
 //随意创建的一个对象 是类型1的viewholder所需要的bean
            StudentInfo studentInfo_one = new StudentInfo("张三", "10", "url");
 //添加数据  总要告诉我 item的layoutId和item所需的实体对象吧 不能再少了吧
            iTypeList.add(BaseType.addType(R.layout.item_one, studentInfo_one));
 //随意创建的一个对象 是类型2的viewholder所需要的bean
            StudentInfo studentInfo_two = new StudentInfo("张三", "10", "url");
            iTypeList.add(BaseType.addType(R.layout.item_two, studentInfo_two));
        }
  1. 数据准备好了,创建adapter(公共的,获取对象就行拉)
//不管你是啥 就这一个adapter
BaseRecyclerAdapter adapter = new BaseRecyclerAdapter(this, iTypeList);
  1. adapter创建好了,我们需要创建viewholder啦,这个是具体实现啦,不能再少啦
adapter.createViewHolderFactory(new ViewHolderFactory() {
            @Override
            public BaseRecyclerViewHolder getViewHolder(int viewType, View itemView) {
                BaseRecyclerViewHolder baseRecyclerViewHolder = null;
                //根据type创建所需的viewholder
                switch (viewType) {
                    case R.layout.item_one:
                        baseRecyclerViewHolder = new OneHolder(itemView);
                        break;
                    case R.layout.item_two:
                        baseRecyclerViewHolder = new TwoHolder(itemView);
                        break;
                }
                return baseRecyclerViewHolder;
            }
        });
  1. 添加好了viewHolder之后基本就完成啦
//基本操作 没啥了
 ·      recycler.setLayoutManager(new LinearLayoutManager(this));
        recycler.setAdapter(adapter);
  1. 我们来看下viewholder写的啥吧
//很简单了 findview+setViewData 一眼就看的明白了
public class OneHolder extends BaseRecyclerViewHolder<StudentInfo> {
    public TextView textView;

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

    @Override
    public void findView(View itemView) {
        textView = itemView.findViewById(R.id.text);
    }

    @Override
    public void setViewData(StudentInfo model) {
        textView.setText(model.getName() + "类型一  " + getAdapterPosition());
    }
}

一个大大的结尾

不知道你们感觉如何呢,代码地址,有兴趣的可以看下哟。代码也比较简单,我就不详细介绍啦。一个简短的小介绍结束了。。。