這次主要講多種Item的使用,添加,刪除
多種Item
我之前在網(wǎng)上見(jiàn)過(guò)一些其他的思路,覺(jué)得做得有些麻煩了脖咐。我的思路是通過(guò)在數(shù)據(jù)上增加一個(gè)屬性Type,來(lái)通過(guò)它來(lái)判斷不同的類型ViewHolder。
- 準(zhǔn)備數(shù)據(jù)的改變
- 創(chuàng)建一個(gè)實(shí)體類
public class ChatEntity {
private String content;//內(nèi)容
private int type;//類型
//剩下的構(gòu)造方法汇歹,get/set方法
}
- 添加數(shù)據(jù)
//實(shí)例化一個(gè)ArrayList對(duì)象
ArrayList<ChatEntity> list = new ArrayList<>();
//實(shí)例化一個(gè)ChatEntity對(duì)象
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);
//添加數(shù)據(jù)
list.add(entity1);
list.add(entity2);
list.add(entity3);
list.add(entity4);
- 在適配器中
繼承時(shí)不用加泛型
- 復(fù)寫(xiě)一個(gè)返回具體類型
list.add(entity4);public int getItemViewType(int position) {
return list.get(position).getType();
}
- 緩存組件改為兩個(gè)
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);
}
}
- 創(chuàng)建視圖方法改為
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//判斷類型是0還是1
if (viewType == 0){
//獲取一個(gè)View對(duì)象
View sendView = LayoutInflater.from(context).inflate(R.layout.send_item,parent,false);
//實(shí)例化一個(gè)發(fā)送的ViewHolder
SendViewHolder sendViewHolder = new SendViewHolder(sendView);
return sendViewHolder;
}else {
//獲取一個(gè)View對(duì)象
View receiveView = LayoutInflater.from(context).inflate(R.layout.receive_item,parent,false);
//實(shí)例化一個(gè)接收的ViewHolder
ReceiveViewHolder receiveViewHolder = new ReceiveViewHolder(receiveView);
return receiveViewHolder;
}
}
- 填充數(shù)據(jù)
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//判斷類型值是0還是1
if (getItemViewType(position)==0){
//獲取要顯示的內(nèi)容
ChatEntity entity = list.get(position);
String content = entity.getContent();
//獲取一個(gè)SendViewHolder對(duì)象
SendViewHolder sendViewHolder = (SendViewHolder) holder;
//給控件上顯示內(nèi)容
sendViewHolder.tvSend.setText(content);
}else {
//獲取要顯示的內(nèi)容
ChatEntity entity = list.get(position);
String content = entity.getContent();
//獲取一個(gè)ReceiveViewHolder對(duì)象
ReceiveViewHolder receiveViewHolder = (ReceiveViewHolder) holder;
//給控件顯示內(nèi)容
receiveViewHolder.tvReceive.setText(content);
}
}
剩下的那么跟之前一樣
添加
public void add(int position,String content){
//往數(shù)據(jù)集合中添加數(shù)據(jù)
list.add(position,content);
//刷新無(wú)動(dòng)畫(huà)
notifyDataSetChanged();
//刷新有動(dòng)畫(huà)
notifyItemInserted(position);
}
刪除
public void remove(int position){
//判斷List的大小是否小于要?jiǎng)h除的位置
if (list.size() < position + 1){
return;
}
//數(shù)據(jù)集合中刪除某個(gè)位置的數(shù)據(jù)
list.remove(position);
//刷新無(wú)動(dòng)畫(huà)
//notifyDataSetChanged();
//刷新有動(dòng)畫(huà)
notifyItemRemoved(position);
}
注:
- ItemAnimator是一個(gè)抽象類,它有一個(gè)默認(rèn)實(shí)現(xiàn)類DefaultItemAnimator笔喉,為RecyclerView設(shè)置動(dòng)畫(huà)使用
recyclerView.setItemAnimator(new DefaultItemAnimator());
切記:更新動(dòng)畫(huà)使用notifyItemInserted(position);
和notifyItemRemoved(position);
取视。 - 在github上有很多自定義的動(dòng)畫(huà)效果了硝皂,比如RecyclerViewItemAnimators,大家自己下載查看作谭,
它提供了SlideInOutLeftItemAnimator,SlideInOutRightItemAnimator等動(dòng)畫(huà)效果稽物。
RecyclerView的系列的文章
- 第一篇RecyclerView的基本使用 RecyclerView使用(一)
- 第二篇有關(guān)多種Item,添加,刪除 RecyclerView使用(二)
- 第三篇RecyclerView的監(jiān)聽(tīng)方法RecyclerView使用(三)
- 第四篇RecyclerView的拖動(dòng)和滑動(dòng)刪除RecyclerView使用(四)