现在越来越多的人都开始用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. 以上就是使用方法.
源码地址:传送门