RecyclerView使用(二)

这次主要讲多种Item的使用,添加,删除

多种Item

我之前在网上见过一些其他的思路,觉得做得有些麻烦了。我的思路是通过在数据上增加一个属性Type,来通过它来判断不同的类型ViewHolder。

  1. 准备数据的改变
  • 创建一个实体类
public class ChatEntity {
    private String content;//内容
    private int type;//类型
    //剩下的构造方法,get/set方法
}
  • 添加数据
//实例化一个ArrayList对象
ArrayList 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);
  1. 在适配器中
    继承时不用加泛型
  • 复写一个返回具体类型
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使用(四)

你可能感兴趣的:(RecyclerView使用(二))