碰到这样一个需求,有一个关注列表,点击列表上的关注按钮可以取消关注。
首先列表这里选择的是RecyclerView,实现起来也较为简单,实现Adapter绑定数据就可以了
但是取消关注后需要将该用户从列表里移除,为了不整体刷新,所以选择使用notifyItemRemoved而不是notifyDataSetChanged方法,因为notifyItemRemoved不会删除adapter中数据集中真实的元素,因此还需要调用dataList.remove(i)
但是测试的时候发现了一个问题:
点击第一个用户,成功删除,nice.
这时候原来的第二个用户成了第一个用户,按照之前的逻辑,这个地方的position应该是0。但是,点击之后删除的是现在的第二个用户,也就是说position是1。
网上搜索后发现,在notifyItemRemoved虽然移除了视图,但是没有进行重新bind的过程,因此position还是之前的position,因此需要调用notifyItemRangeChanged方法来告诉应用position位置需要重新计算
* Notify any registered observers that the <code>itemCount</code> items starting at
* position <code>positionStart</code> have changed.
* Equivalent to calling <code>notifyItemRangeChanged(position, itemCount, null);</code>.
*
* <p>This is an item change event, not a structural change event. It indicates that
* any reflection of the data in the given position range is out of date and should
* be updated. The items in the given range retain the same identity.</p>
*
* @param positionStart Position of the first item that has changed
* @param itemCount Number of items that have changed
*
* @see #notifyItemChanged(int)
*/
上面一段来自RecyclerView源码中的注释,notifyItemRangeChanged方法需要两个参数,第一个来指定从哪里开始数据进行了变化,第二个参数需要指定总共变化了多少个数据。
在最开始提到的需求下,positionStart应该等于要删除的那个数据的坐标,itemCount应该为从positionStart开始到数据列表最后,但是为了方便就直接填getItemCount()更新所有数据了