如何使用holder.getAdapterPosition修复RecyclerView onBindViewHolder位置警告
问题原因
Do not treat position as fixed; only use immediately and call
holder.getAdapterPosition()to look it up later
官方警告含义:不要将position视为固定值,仅可即时使用,后续需要查询位置时请调用holder.getAdapterPosition()
onBindViewHolder 方法传入的position参数仅在当前绑定视图的瞬间有效,你在点击事件回调里引用的position属于异步调用,此时item的位置可能已经因为列表增删、排序发生变化,直接用旧position会取到错误数据,甚至触发数组越界异常。
修改方案
把点击事件内部所有用到外部position的地方,替换为holder.getAdapterPosition(),同时增加边界判断,避免holder已经脱离RecyclerView时(返回值为-1,对应常量RecyclerView.NO_POSITION)的异常情况。
修改后完整代码
@Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { //13---getting data from our arrays holder.book_id_txt.setText(String.valueOf(book_id.get(position))); holder.book_title_txt.setText(String.valueOf(book_title.get(position))); holder.book_author_txt.setText(String.valueOf(book_author.get(position))); holder.book_pages_txt.setText(String.valueOf(book_pages.get(position))); holder.mainLinearLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 点击时实时获取当前最新的位置 int currentPosition = holder.getAdapterPosition(); // 边界判断,避免无效位置触发异常 if (currentPosition == RecyclerView.NO_POSITION) { return; } Intent intent = new Intent(context, UpdateActivity.class); // transferring data inside activity intent.putExtra("id", String.valueOf(book_id.get(currentPosition))); intent.putExtra("title", String.valueOf(book_title.get(currentPosition))); intent.putExtra("author", String.valueOf(book_author.get(currentPosition))); intent.putExtra("pages", String.valueOf(book_pages.get(currentPosition))); context.startActivity(intent); } }); }
内容的提问来源于stack exchange,提问作者Sergio Matiash
相关产品推荐
相关产品推荐

