Android:Recycler查看项目快速单击它会使应用程序崩溃

Android:Recycler查看项目快速单击它会使应用程序崩溃,android,android-recyclerview,Android,Android Recyclerview,我已经搜索了很多,我做的是创建一个项目列表简单的数字和复选框,这是选中和取消选中,所以当我点击快速列表它崩溃 并生成ArrayIndexOutOfBound异常 所以我不知道我做错了什么 这是我的密码 适配器类 class SingleListItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private TextView mItemDate, mFontSizeCategory;

我已经搜索了很多,我做的是创建一个项目列表简单的数字和复选框,这是选中和取消选中,所以当我点击快速列表它崩溃 并生成ArrayIndexOutOfBound异常

所以我不知道我做错了什么

这是我的密码

适配器类

  class SingleListItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

private TextView mItemDate, mFontSizeCategory;
    private ImageView isChecked, isTrack, isUnChecked;
    private int fontSize = 13;
SingleListItemHolder(View v) {
    super(v);
    mFontSizeCategory = (TextView) v.findViewById(R.id.tv_font_size_category);
    mItemDate = (TextView) v.findViewById(R.id.tv_recycler_view_list_header);
    isChecked = (ImageView) v.findViewById(R.id.iv_recycler_view_list_item_selected);
    isUnChecked = (ImageView) v.findViewById(R.id.iv_recycler_view_list_item_unselected);
    isTrack = (ImageView) v.findViewById(R.id.iv_track);
    v.setOnClickListener(this);
    this.setIsRecyclable(false);
}

@Override
public void onClick(View v) {
    mSingleItemListModels.get(pos).setSelected(false);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
    pos = getAdapterPosition();
    mSingleItemListModels.get(pos).setSelected(true);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
}

您必须在使用pos=getAdapterPosition()之前获取该项

@Override
public void onClick(View v) {

    pos = getAdapterPosition();


    mSingleItemListModels.get(pos).setSelected(false);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
    mSingleItemListModels.get(pos).setSelected(true);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
上移

mSingleItemListModels.get(pos).setSelected(false);

您误用了
getAdapterPosition
。使用它来获取当前显示项目的索引不是一个好主意。更糟糕的是,如果您调用了适配器更改(使用
notifyItemChanged
执行了两次),它也可能返回
-1

请参阅文档

请注意,如果调用notifyDataSetChanged(),直到下一个布局过程,此方法的返回值将为NO_POSITION

无位置
的值为
-1
。因此,与其在
RecyclerView.ViewHolder
中实现
ClickListener
,不如在
onBindViewHolder
中实现它,因为这里有当前索引

在这里使用它

 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
       // the position will be the correct one
       // but don't store the position in a class field 
       // since it may change during scrolling
    }
您在getAdapterPosition()中获得了-1位置,因为当您快速单击时,它会在某个时间抛出-1位置

你可以看看这个

if (pos != RecyclerView.NO_POSITION) {
//Do your setting part
}
更改此代码

@Override
public void onClick(View v) {
    mSingleItemListModels.get(pos).setSelected(false);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
    pos = getAdapterPosition();
    mSingleItemListModels.get(pos).setSelected(true);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
@Override
public void onClick(View v) {
    mSingleItemListModels.get(pos).setSelected(false);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
    pos = getAdapterPosition();
     if (pos != RecyclerView.NO_POSITION) {
        mSingleItemListModels.get(pos).setSelected(true);
        notifyItemChanged(pos, mSingleItemListModels.get(pos));
     }
}
编码到

@Override
public void onClick(View v) {
    mSingleItemListModels.get(pos).setSelected(false);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
    pos = getAdapterPosition();
    mSingleItemListModels.get(pos).setSelected(true);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
@Override
public void onClick(View v) {
    mSingleItemListModels.get(pos).setSelected(false);
    notifyItemChanged(pos, mSingleItemListModels.get(pos));
    pos = getAdapterPosition();
     if (pos != RecyclerView.NO_POSITION) {
        mSingleItemListModels.get(pos).setSelected(true);
        notifyItemChanged(pos, mSingleItemListModels.get(pos));
     }
}

引发异常的行是什么?mSingleItemListModels.get(pos).setSelected(true);它抛出错误onCLick的第一行应该是pos=getAdapterPosition();然后你可以访问ObjectsPosition,它是在我的适配器构造函数中设置的,它是全局的,我在onclick@AmjadkhanUp vote中把这段代码放在哪里,因为这是解决OP问题背后问题的唯一答案。OP的问题始于糟糕的代码设计。其他答案(包括公认的答案)是一个快速解决方案,但不能消除真正的问题。