美文网首页
RecyclerView中notifyItemRemoved的一

RecyclerView中notifyItemRemoved的一

作者: uzck | 来源:发表于2017-05-13 20:58 被阅读0次

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

    相关文章

      网友评论

          本文标题:RecyclerView中notifyItemRemoved的一

          本文链接:https://www.haomeiwen.com/subject/iyrvgttx.html