我试图在我的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);
      }
    });
  }
});

07-25 23:34