我正在尝试在我的AlertDialog
课程中显示ViewHolder
,点击接受按钮后,我从项目列表中获取带有getAdapterPosition
的模型项目,但是在Fabric中Crashlytics我有13次崩溃,因为ArrayIndexOutOfBoundsException
表示长度为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
为空,那么getAdapterPosition
源代码RecyclerView
中的将返回-1,如果活动已关闭但是如何发生这种情况会发生这种情况?当AlertDialog
显示时,用户无法关闭活动!
答案 0 :(得分:2)
根据docs,如果您的观看者已经被回收,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);
}
});
}
});