You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将RecyclerView的position传递至另一个Activity的问题求助

问题解决:Adapter中position无法传递到另一个Activity

可能原因及解决方案:

  1. 直接使用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);
        }
    });
}
  1. 检查接收Activity的参数获取方式
    确保在Update_transaction中用正确方法获取int类型的position:
// 在Update_transaction的onCreate方法中
int receivedPos = getIntent().getIntExtra("pos", -1);
// 打印日志确认是否获取成功
Log.d("ReceivedPos", String.valueOf(receivedPos));

如果误用getStringExtra获取int类型参数,会得到null,看起来像是传递失败。

  1. 更健壮的方案:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:25:22