繁体   English   中英

Android:Recycler视图项快速单击它会使应用程序崩溃

[英]Android: Recycler view item fast clicking it crash the application

我已经搜索了很多我所做的是创建了一个项目列表简单数字和复选框哪个被选中和未选中,所以当我快速点击列表时它会崩溃并生成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();

走到上面

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

你必须在使用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));
}

你在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));
     }
}

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

这里查看文档

请注意,如果您调用了notifyDataSetChanged(),则在下一个布局传递之前,此方法的返回值将为NO_POSITION。

NO_POSITION值为-1 因此,不应将ClickListener实现到RecyclerView.ViewHolder ,而应在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
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM