RecyclerView关于添加/删除Item的那些坑~~~

来源:互联网 发布:java zip压缩并加密 编辑:程序博客网 时间:2024/05/22 05:14

近来在做一个Android项目,用到了RecyclerView。相比ListView单调的notifydatasetchanged,RecyclerView在添加/删除Item时有多种方法可以选择。

例如:添加Item可以用notifyItemInserted和notifyItemRangeInserted,删除Item可以用notifyItemRemoved和notifyItemRangeRemoved。这些通知方法都自带酷炫的动画,只需一行代码就能打造远比ListView华丽的界面。

但需要注意的是,这些带有动画效果的方法仅仅是起到界面动画的效果,实际上并没有进行数据与界面的重新绑定。通过打log可以发现,动画播放前后,onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)中的position形参是没有改变的。但实际上由于添加/删除Item的影响,被点击的Item(假如这个Item是列表中靠后的)的position值应该添加1或减少1。

所以说RecyclerView这些动画效果方法在本质上并不能等价于ListView的notifydatasetchanged方法。正确地添加/删除Item的步骤应该为先调用动画方法,再通知Adapter重新绑定数据与界面。用添加Item举例:

//添加数据public void addItem(int position, Object data) {mDatas.add(position, data);notifyItemInserted(position);//通知演示插入动画notifyItemRangeChanged(position,mDatas.size()-position);//通知数据与界面重新绑定}
其实通过观察方法名字可以看出来,无论是notifyItemInserted还是notifyItemRemoved的方法名中,都没有“Changed”这个单词。所有notify开头的方法中,仅仅只有以下三个方法带有“Changed”单词且具有重新绑定数据与界面的功能:

notifyDataSetChanged();//通知重新绑定所有数据与界面notifyItemChanged(int);//通知重新绑定某一个Item的数据与界面notifyItemRangeChanged(int, int);//通知重新绑定某一范围内的的数据与界面




20 0
原创粉丝点击