场景是这样的:
RecyclerView的item中有一个button,点击button后会删除这个item,如果我调用mAdapter.notifyDataSetChanged();
,数据正常显示,但如果我调用mAdapter.notifyItemRemoved(position);
,就会出现删除异常的各种问题,比如数组越界的问题等等。
原因分析
经过分析源码,发现notifyDataSetChanged最终会使adapter的数据重新绑定,即会重新调用adapter里的onBindViewHolder方法,从而使item的position得到了更新;但是我们的notifyItemxxx方法呢?他并不会更新item的position,所以导致了上面描述的问题。
解决办法
用相面两行代码替代:
mAdapter.notifyItemRemoved(position);
mAdapter.notifyItemRangeRemoved(position,mAdapter.getItemCount());
第二行代码的作用:通知这个item后面的item,你们的position要改变了,如是而已。