getAdapterPosition在ViewHolder类中返回-1

时间:2018-02-20 08:34:43

标签: java android android-recyclerview

我正在尝试在我的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显示时,用户无法关闭活动!

1 个答案:

答案 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);
      }
    });
  }
});
相关问题