RecyclerView中notifyItemRemoved的一个坑

碰到这样一个需求,有一个关注列表,点击列表上的关注按钮可以取消关注。
首先列表这里选择的是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()更新所有数据了

推荐阅读更多精彩内容