配合 这篇文章里面写的 Android RecylerView多布局优化 把里面的MyAdapter抽取出来 写了一个JacenRecylerViewAdapter 基本可以实现一些简单的页面 也不需要再写那么多Adapter了。
不多说了,直接帖代码。
/**
* 暂时想这么多,等哪天把多布局的也集成进来 直接一个adapter就好了
* @version 1.0
* @email [email protected]
* Created by Jacen on 2017/12/31 0:51.
*/
public class JacenRecylerViewAdapter<T> extends RecyclerView.Adapter {
protected Context context;
protected OnItemClickListener l;
protected List<T> mList;
private SparseArray<IViewItem> sparseArray;
/**
* 如果是单布局 则sparseArray.put(0,IViewItemImpl);
* 否则复写getItemViewType(int position)方法 对应的布局 对应的key
* @param context
* @param l
* @param mList
* @param sparseArray
*/
public JacenRecylerViewAdapter(Context context, OnItemClickListener l, List<T> mList, SparseArray<IViewItem> sparseArray) {
this.context = context;
this.l = l;
this.mList = mList;
this.sparseArray = sparseArray;
}
public void updateList(List<T> mList) {
this.mList = mList;
notifyDataSetChanged();
}
public void addData(T data,int position){
if(mList == null){
mList = new ArrayList<T>();
}
mList.add(position,data);
notifyItemInserted(position);
notifyItemChanged(position);
}
public void updateData(T data, int position){
if(mList == null) return;
mList.remove(position);
mList.add(position,data);
}
public T getData(int position){
return mList != null ? mList.get(position) : null ;
}
public void removeData(int position){
mList.remove(position);
notifyItemRemoved(position);
notifyItemChanged(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return sparseArray.get(viewType).onCreateViewHolder(context,parent,l);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
sparseArray.get(getItemViewType(position)).onBindViewHolder(holder,mList.get(position));
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
}
Activity里面 这样写就可以了
SparseArray<IViewItem> sparseArray = new SparseArray();
sparseArray.put(ChatType.text.getLeft(),new ChatLeftTextViewItemImpl());
sparseArray.put(ChatType.text.getRight(),new ChatRightTextViewItemImpl());
//这里是多布局才这么写 如果是单布局的话 这么写就可以了
//sparseArray.put(0,new ChatLeftTextViewItemImpl());
//因为adapter源码里面getItemViewType默认返回的就是0
mAdapter = new MyAdapter(this, mList,sparseArray, this);
由于是多布局 继承JacenRecylerViewAdapter 重写getItemViewType这个方法就好了
/**
* @version 1.0
* @email [email protected]
* Created by Jacen on 2017/12/31 1:55.
*/
public class MyAdapter extends JacenRecylerViewAdapter {
/**
* 如果是单布局 则sparseArray.put(0,IViewItemImpl);
* 否则复写getItemViewType(int position)方法 对应的布局 对应的key
*
* @param context
* @param l
* @param mList
* @param sparseArray
*/
public MyAdapter(Context context, List mList, SparseArray sparseArray,OnItemClickListener l) {
super(context, l, mList, sparseArray);
}
@Override
public int getItemViewType(int position) {
ChatMessageVo vo = (ChatMessageVo) mList.get(position);
return vo.isMe() ? vo.getChatType().getRight() : vo.getChatType().getLeft();
}
}
搞定!
如果不好得地方 欢迎不吝回复指点