RecyclerView Adapter如何获知需要调用onCreateViewHolder等方法?
问题解答
疑问1:仅向列表中添加一个Item对象,Adapter是如何知道要调用onCreateViewHolder、onBindViewHolder等方法的?
疑问2:该逻辑是否和代码中的notifyItemInserted(items.size - 1)语句有关?
疑问3:是否每次调用该方法时,就会为对应条目重新触发onCreateViewHolder方法?
关于触发逻辑和
notifyItemInserted的关系:是的,整个视图更新的触发逻辑完全由这个语句驱动。
你直接对Adapter内部的items列表做增删改操作的时候,RecyclerView本身是完全感知不到数据变化的,它不会主动扫描数据集的状态变更。必须通过Adapter调用notify系列通知方法,明确告诉RecyclerView「数据发生了什么类型的变更、变更的位置在哪里」,RecyclerView才会触发对应的视图更新流程。你调用notifyItemInserted(items.size - 1)就是在通知RecyclerView:「我在列表末尾新增了一条数据,请更新对应位置的视图」,收到这个通知后RecyclerView才会去调度执行onCreateViewHolder、onBindViewHolder相关方法。关于是否每次调用
notifyItemInserted都会触发onCreateViewHolder:答案是否定的。
RecyclerView内置了ViewHolder复用池机制,它会优先复用已经创建过、滑出屏幕进入闲置状态的ViewHolder实例。只有当复用池中没有对应viewType的可用ViewHolder时,才会调用onCreateViewHolder创建新的实例;如果有可用的闲置ViewHolder,只会调用onBindViewHolder把新数据绑定到已有ViewHolder上,不会重复创建。
举个实际场景:假设你的手机屏幕当前最多能同时展示6个列表Item,那么前6次调用addItem新增数据的时候,因为没有可用的复用池缓存,都会触发onCreateViewHolder;当你新增第7个Item的时候,第1个Item已经滑出屏幕进入复用池,这时候就会直接复用第1个的ViewHolder,只会走onBindViewHolder绑定第7条的内容,不会重新创建ViewHolder。
内容的提问来源于stack exchange,提问作者skushu

