不废话,直接贴代码
public interface IViewItem<D,H extends RecyclerView.ViewHolder> {
/**
*
* @param context
* @param parent
* @param l 这个是做类似于ListView OnItemClickListener 如需长按时间 多添加一个OnItemLongClickListener
* @return
*/
RecyclerView.ViewHolder onCreateViewHolder(Context context,ViewGroup parent,OnItemClickListener l);
void onBindViewHolder(RecyclerView.ViewHolder holder,D data);
}
/**
* @version 1.0
* @email jacen@iswsc.com
* Created by Jacen on 2017/12/29 15:05.
*/
public class MyAdapter extends RecyclerView.Adapter {
private Context mContext;
private List<ChatMessageVo> mList;
private SparseArray<IViewItem> sparseArray;
private OnItemClickListener l;
private final int MESSAGE_LEFT_TEXT = 1;
private final int MESSAGE_RIGHT_TEXT = 2;
public MyAdapter(Context mContext, List<ChatMessageVo> mList,OnItemClickListener l) {
this.mContext = mContext;
this.mList = mList;
this.l = l;
sparseArray = new SparseArray<IViewItem>();
sparseArray.put(MESSAGE_LEFT_TEXT,new ChatLeftTextViewItemImpl());
sparseArray.put(MESSAGE_RIGHT_TEXT,new ChatRightTextViewItemImpl());
//如果还有别的布局 添加聊天类型 以及实现类 配置一下这里就可以了
}
@Override
public int getItemViewType(int position) {
ChatMessageVo vo = mList.get(position);
return vo.isMe() ? vo.getChatType().getRight() : vo.getChatType().getLeft();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return (RecyclerView.ViewHolder) sparseArray.get(viewType).onCreateViewHolder(mContext,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();
}
}
/**
* @version 1.0
* @email jacen@iswsc.com
* Created by Jacen on 2017/12/28 22:24.
*/
public class ChatLeftTextViewItemImpl implements IViewItem {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(Context context, ViewGroup parent, OnItemClickListener l) {
View left_text = LayoutInflater.from(context).inflate( R.layout.item_chat_text_left, parent,false);
return new LeftTextHolder(left_text, l);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, Object data) {
LeftTextHolder h = (LeftTextHolder) holder;
ChatMessageVo vo = (ChatMessageVo) data;
h.mTime.setText(JacenUtils.parseChatTimer(vo.getSendTime()));
h.mTime.setVisibility(vo.isShowTime() ? View.VISIBLE : View.GONE);
h.mContent.setText(vo.getContent());
}
class LeftTextHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView mTime;
ImageView mAvatar;
TextView mContent;
OnItemClickListener l;
LeftTextHolder(View view, OnItemClickListener l) {
super(view);
view.setOnClickListener(this);
this.l = l;
mTime = (TextView) view.findViewById(R.id.time);
mAvatar = (ImageView) view.findViewById(R.id.avatar);
mContent = (TextView) view.findViewById(R.id.content);
}
@Override
public void onClick(View v) {
l.onItemClick(v, getLayoutPosition());
}
}
}
adapter里面是不是爽多了,再也不用去垒代码了,多一个item多一个实现类 在adapter构造函数里面配置一下就可以用了。
本文源自一家公司的面试官跟我提供的一些RecylerView多布局解耦的思路,面试完之后回来回想后写的,文中如有错误,或更好的办法,欢迎批评指正!