getAdapterPosition在ViewHolder类中返回-1

我正试图在我的ViewHolder类中显示一个AlertDialog ,点击接受按钮后,我从一个项目列表中获取带有getAdapterPosition的Model项目,但在Fabric Crashlytics中我因为ArrayIndexOutOfBoundsException而导致13次崩溃,其中长度为12但是请求的索引是-1,崩溃是针对此部分代码中的getPaymentMode

 class ViewHolder extends RecyclerView.ViewHolder { TextView time, capacity, description; View button; ImageView avatar; ViewHolder(View v) { super(v); time = v.findViewById(R.id.reserve_times_time); capacity = v.findViewById(R.id.reserve_times_capacity); button = v.findViewById(R.id.button); description = v.findViewById(R.id.reserve_times_description); avatar = v.findViewById(R.id.avatar); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); alertDialogBuilder.setView(R.layout.layout_dialog); alertDialogBuilder.setPositiveButton("accept", null); alertDialogBuilder.setNegativeButton("cancel", null); final AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.dialog_button_text_size)); alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.dialog_button_text_size)); alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { alertDialog.dismiss(); getPaymentMode(arrayList.get(getAdapterPosition()), button); } }); } }); } 

RecyclerView源代码中,当所有者RecyclerView为null时, getAdapterPosition返回-1,如果活动已关闭但是如何发生这种情况会发生这种情况? 当AlertDialog显示用户无法关闭活动时!

根据文档 ,如果您的视图持有者已被回收,则getAdapterPosition()将返回NO_POSITION (也称为-1)。

项目的适配器位置(如果它仍存在于适配器中)。 NO_POSITION如果项目已从适配器中删除,则在最后一次布局传递或ViewHolder已被回收后调用notifyDataSetChanged()。

我的猜测是,当您点击对话框按钮时,您的视图持有者已经被回收。 尝试在onClick()方法开始时正确存储位置,然后在需要时使用它,例如:

 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = getAdapterPosition() //Your code here alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { alertDialog.dismiss(); getPaymentMode(arrayList.get(position), button); } }); } });