首次加载与刷新RecyclerView时notifyItemInserted与notifyItemChanged的差异
RecyclerView空列表调用notifyItemChanged的问题解答
首先直接给结论:当列表为空时调用notifyItemChanged(position)一定会抛出IndexOutOfBoundsException。原因很直白,RecyclerView的Adapter会先校验你传入的position是否在当前数据集的有效范围内(也就是0 <= position < getItemCount()),空列表的getItemCount()是0,任何position都不满足这个条件,直接触发越界异常。
然后关于你问的是否需要先调用notifyItemInserted(position)再用notifyItemChanged?答案是肯定的,这也是符合Adapter规范的正确流程:
- 当你要逐个添加列表项时,第一步得先把数据对象添加到你的数据集集合里(比如ArrayList这类容器);
- 紧接着调用
notifyItemInserted(newItemPosition),这里的newItemPosition一般是数据集的size()-1(因为是往末尾新增),这个方法会通知RecyclerView有新项插入,它会执行对应的添加动画并绑定数据; - 如果之后这个已存在的项内容需要更新,再调用
notifyItemChanged(targetPosition),这时候position是有效的,就能正常触发该项的UI更新。
另外补充下你提到的不用notifyDataSetChanged的选择:你的需求是逐个添加项并保留插入动画,notifyDataSetChanged会强制刷新整个列表,不仅没有动画,效率也低,所以用单个的notify方法是更优的选择,但一定要区分插入和更新的场景——插入用notifyItemInserted,更新用notifyItemChanged,两者的作用逻辑完全不同,不能混用。
内容的提问来源于stack exchange,提问作者bycfly
相关产品推荐
相关产品推荐

