打造 RecyclerView的 通用Adapter



现在越来越多的人都开始用RecyclerView,  在此, 我也是推荐大家尽快去把ListView换成RecyclerView.

RecyclerView的好处有很多 比如:

1. 灵活的在ListView、GridView、瀑布流中来回切换. 只需要setLayoutManager. 非常方便.

2. 可以自定义添加分割线.

3. 可以自定义增加、删除item 的动画.

4. 不用在管ViewHolder 复用问题. because, 谷歌帮我们做了.

5.可以单个item 增加, 删除. notify.  (以前我们用ListView大部分的人都是直接NotifiDataSetChange(),这样整个列表都会刷新,并不是理想状态)


暂时就想到了以上这些优点, 有不足的欢迎大家补充, 不过我相信. 这些优点已足够你 把ListView换成RecyclerView了.


那么在用RecyclerView的时候, 我们每次都需要 new Adapter, 和new ViewHolder. 这样的代码的冗余程度非常的高,而且看起来很乱.  下面我就为大家讲解一套通用的Adapter.


首先我们来看看如何使用.

如果你是正常的ListView布局.

//        普通 adapter.
        mRecyclerView.setAdapter(new BaseAdapter<String>(this, R.layout.item_layout, mDatas) {
            @Override
            public void updateUI(BaseHolder holder, int position, String data) {
                holder.setText(R.id.tv, data);
            }
        });

new BaseAdapter<泛型>(context,你的布局,数据),  之后你只需要在 updateUI里面 直接使用holder.setText,传入控件id以及data就可以了.


如果你是多种不同的布局.

//多布局adapter
        mRecyclerView.setAdapter(new MultiLayoutAdapter<String>(this, mDatas) {
            @Override
            public int multiLayout(int position) {
                // 这里根据 自己需求, 来决定返回什么布局
                if (position == 0 || position == 2 || position == 4)
                    return R.layout.item_layout;
                return R.layout.item_layout1;
            }

            @Override
            public void updateMuiltUI(BaseHolder holder, int position, List<String> data) {
                if (R.layout.item_layout == getLayoutId(<span style="font-family:Arial, Helvetica, sans-serif;">holder</span>)) {
                    holder.setText(R.id.tv, "哈哈");
                } else {
                    holder.setText(R.id.tv, "嘎嘎");
                }
            }

            @Override
            public void setListener(final BaseHolder holder, final List<String> data) {
                holder.getView(R.id.tv).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this, data.get(holder.getAdapterPosition()), Toast.LENGTH_LONG).show();
                    }
                });
            }
        });

可以看到,如果我们是多种布局 new MultiLayoutAdapter(context,data).  在multiLayout里 根据你自己的需求 来返回布局id, 在updateMuiltUI里 调用getLayoutId(holder), 来判断是哪个布局, 从而分别操作.


如果你想要设置监听, 那么需要覆写setListener方法.    然后使用holder.getView 获取你想要设置监听的view. 以上就是使用方法.


源码地址:传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值