這次主要講多種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使用(四)