无法将RecyclerView的position传递至另一个Activity的问题求助
问题解决:Adapter中position无法传递到另一个Activity
可能原因及解决方案:
- 直接使用onBindViewHolder的position参数,替代holder.getAdapterPosition()
你当前代码中用holder.getAdapterPosition()获取位置,但这个方法返回的是holder在Adapter中的实时位置,如果点击时数据集已发生变化(比如增删item),会返回NO_POSITION(-1),导致传递失败。而onBindViewHolder方法的position参数是绑定该item时的固定位置,在点击事件中更可靠。
修改代码如下:
// 给onBindViewHolder的position参数加上final public void onBindViewHolder(@NonNull UltAdapter.MyViewHolder holder, final int position) { TransactionModel MyModel = myViewsList.get(position); Log.d("checkTag -> ", MyModel.getType()); holder.amount.setText(MyModel.getAmount()); if(Objects.equals(MyModel.getType(), "Income")) { holder.amount.setTextColor(Color.GREEN); holder.priority.setBackgroundResource(R.drawable.mark); } else { holder.amount.setTextColor(Color.RED); holder.priority.setBackgroundResource(R.drawable.redmark); } // 移除final int pos = holder.getAdapterPosition();这行 holder.date.setText(MyModel.getDate()); holder.note.setText(MyModel.getNote()); holder.Btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(context,Update_transaction.class); i.putExtra("key",myViewsList.get(position).getId()); i.putExtra("pos",position); context.startActivity(i); } }); }
- 检查接收Activity的参数获取方式
确保在Update_transaction中用正确方法获取int类型的position:
// 在Update_transaction的onCreate方法中 int receivedPos = getIntent().getIntExtra("pos", -1); // 打印日志确认是否获取成功 Log.d("ReceivedPos", String.valueOf(receivedPos));
如果误用getStringExtra获取int类型参数,会得到null,看起来像是传递失败。
- 更健壮的方案:通过id反向查找position
position会随数据集变化(比如删除item)改变,依赖position传递并非最优解。你已能成功传递id,可在接收Activity中通过id找到对应position:
// 假设id是String类型,若为int则用getIntExtra String receivedId = getIntent().getStringExtra("key"); int targetPos = -1; for (int i = 0; i < myViewsList.size(); i++) { if (Objects.equals(myViewsList.get(i).getId(), receivedId)) { targetPos = i; break; } } // targetPos即为对应位置
内容的提问来源于stack exchange,提问作者Sohaibs Amir
相关产品推荐
相关产品推荐

