RecyclerView onBindViewHolder中绑定点击事件的写法是否正确?idGroup需重新获取吗?
RecyclerView点击事件写法答疑
问题1:这种写法是否正确?
是正确的。之前直接用onBindViewHolder里的position绑定点击事件容易踩坑——RecyclerView的列表项会复用,position是临时值,当列表滑动、增删条目后,之前捕获的position会失效,导致点击对应到错误的条目。而通过ViewHolder作为参数,在点击事件里调用holder.getAdapterPosition(),能拿到当前条目实时的正确位置,完美规避这个问题。
不过要额外注意:调用getAdapterPosition()后要先判断返回值是不是RecyclerView.NO_POSITION,避免条目已经被移除时出现空指针或逻辑错误。
问题2:onBindViewHolder中已获取idGroup,是否需要在点击函数内重新获取?
分两种场景判断:
- 如果你的数据源在用户点击前不会发生变化,或者你可以在
onBindViewHolder时把idGroup直接存到ViewHolder的成员变量里(比如给自定义ViewHolder加个long idGroup字段,绑定的时候赋值),那完全不用重新获取,直接用ViewHolder里存好的idGroup就行,更高效。 - 如果数据源可能在用户点击前被更新(比如后台同步了新数据,触发了列表刷新),那最好通过
holder.getAdapterPosition()从最新的数据源里重新获取idGroup,这样能保证拿到的是当前条目的最新数据,避免因为数据更新导致的旧值错误。
内容的提问来源于stack exchange,提问作者JP711
相关产品推荐
相关产品推荐

