2017-10-04 55 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

相關問題