2017-10-04 57 views
3

我有很多搜索我创建了一个项目列表的简单数字和复选框哪些是选中和未选中,所以当我快速点击列表上它碰撞 并产生ArrayIndexOutOfBound异常Android:Recycler查看项目快点击它崩溃应用程序

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

这里是我的代码

适配器类

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)); 
} 
+0

什么是抛出异常的行? –

+0

mSingleItemListModels.get(pos)。的setSelected(真);它抛出错误 –

+0

你的第一行onCLick应该是pos = getAdapterPosition();然后你可以访问的对象 – Pabel

回答

2

你得到的getAdapterPosition)-1的位置(因为当u是点击快速它一些时间抛出-1位置

您可以检查此out

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)); 
    } 
} 
3

您必须在使用前获取该项目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)); 
} 
举动上述
4
pos = getAdapterPosition(); 

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

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

请参阅该文档为它here

注意,如果你打过电话notifyDataSetChanged(),直到下一个布局传递,这个方法的返回值将是NO_POSITION。

NO_POSITION的值是-1。因此,您应该在onBindViewHolder中执行而不是RecyclerView.ViewHolder,因为您有当前的索引。

在这里使用它

@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 
    } 
+1

投票,因为这是解决OP所面临问题的唯一答案。 OP的问题始于糟糕的代码设计。其他答案(包括已接受的答案)是一个快速修复,但并未消除真正的问题。 – Barns

相关问题