我试图在我的AlertDialog
类中显示一个ViewHolder
,然后单击“接受”按钮后,我从项目列表中获得了带有getAdapterPosition
的模型项目,但是在Fabric Crashlytics中,由于表示长度为12,但请求的索引为-1,并且崩溃是针对此部分代码中的ArrayIndexOutOfBoundsException
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);
}
});
}
});
}
在
getPaymentMode
源代码RecyclerView
中,当所有者getAdapterPosition
为null时返回-1,并且如果活动被关闭,将会发生这种情况,但是如何发生呢? RecyclerView
显示时,用户无法关闭活动! 最佳答案
根据docs,如果视图持有者已经被回收,则getAdapterPosition()
将返回NO_POSITION
(aka -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);
}
});
}
});