这次主要讲多种Item的使用,添加,删除
多种Item
我之前在网上见过一些其他的思路,觉得做得有些麻烦了。我的思路是通过在数据上增加一个属性Type,来通过它来判断不同的类型ViewHolder。
- 准备数据的改变
- 创建一个实体类
public class ChatEntity {
private String content;//内容
private int type;//类型
//剩下的构造方法,get/set方法
}
- 添加数据
//实例化一个ArrayList对象
ArrayList<ChatEntity> list = new ArrayList<>();
//实例化一个ChatEntity对象
ChatEntity entity1 = new ChatEntity("How are you ?",0);
ChatEntity entity2 = new ChatEntity("I'm fine.And you?",1);
ChatEntity entity3 = new ChatEntity("你好吗?",0);
ChatEntity entity4 = new ChatEntity("我很好,你呢?",1);
//添加数据
list.add(entity1);
list.add(entity2);
list.add(entity3);
list.add(entity4);
- 在适配器中
继承时不用加泛型
- 复写一个返回具体类型
list.add(entity4);public int getItemViewType(int position) {
return list.get(position).getType();
}
- 缓存组件改为两个
public class SendViewHolder extends RecyclerView.ViewHolder{
TextView tvSend;
public SendViewHolder(View itemView) {
super(itemView);
//初始化控件
tvSend = (TextView) itemView.findViewById(R.id.tv_send);
}
}
public class ReceiveViewHolder extends RecyclerView.ViewHolder{
TextView tvReceive;
public ReceiveViewHolder(View itemView) {
super(itemView);
//初始化控件
tvReceive = (TextView) itemView.findViewById(R.id.tv_receive);
}
}
- 创建视图方法改为
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//判断类型是0还是1
if (viewType == 0){
//获取一个View对象
View sendView = LayoutInflater.from(context).inflate(R.layout.send_item,parent,false);
//实例化一个发送的ViewHolder
SendViewHolder sendViewHolder = new SendViewHolder(sendView);
return sendViewHolder;
}else {
//获取一个View对象
View receiveView = LayoutInflater.from(context).inflate(R.layout.receive_item,parent,false);
//实例化一个接收的ViewHolder
ReceiveViewHolder receiveViewHolder = new ReceiveViewHolder(receiveView);
return receiveViewHolder;
}
}
- 填充数据
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//判断类型值是0还是1
if (getItemViewType(position)==0){
//获取要显示的内容
ChatEntity entity = list.get(position);
String content = entity.getContent();
//获取一个SendViewHolder对象
SendViewHolder sendViewHolder = (SendViewHolder) holder;
//给控件上显示内容
sendViewHolder.tvSend.setText(content);
}else {
//获取要显示的内容
ChatEntity entity = list.get(position);
String content = entity.getContent();
//获取一个ReceiveViewHolder对象
ReceiveViewHolder receiveViewHolder = (ReceiveViewHolder) holder;
//给控件显示内容
receiveViewHolder.tvReceive.setText(content);
}
}
剩下的那么跟之前一样
添加
public void add(int position,String content){
//往数据集合中添加数据
list.add(position,content);
//刷新无动画
notifyDataSetChanged();
//刷新有动画
notifyItemInserted(position);
}
删除
public void remove(int position){
//判断List的大小是否小于要删除的位置
if (list.size() < position + 1){
return;
}
//数据集合中删除某个位置的数据
list.remove(position);
//刷新无动画
//notifyDataSetChanged();
//刷新有动画
notifyItemRemoved(position);
}
注:
- ItemAnimator是一个抽象类,它有一个默认实现类DefaultItemAnimator,为RecyclerView设置动画使用
recyclerView.setItemAnimator(new DefaultItemAnimator());
切记:更新动画使用notifyItemInserted(position);
和notifyItemRemoved(position);
。 - 在github上有很多自定义的动画效果了,比如RecyclerViewItemAnimators,大家自己下载查看,
它提供了SlideInOutLeftItemAnimator,SlideInOutRightItemAnimator等动画效果。
RecyclerView的系列的文章
- 第一篇RecyclerView的基本使用 RecyclerView使用(一)
- 第二篇有关多种Item,添加,删除 RecyclerView使用(二)
- 第三篇RecyclerView的监听方法RecyclerView使用(三)
- 第四篇RecyclerView的拖动和滑动删除RecyclerView使用(四)