2016-12-03 5 views
0

これはどのように可能ですか?Android - recyclerAdapter.getItemはonClickコールバックでnullを返します

アダプターは、位置を使用してビューホルダーをバインドするので、ユーザーは画面上のアイテムビューを表示できます。

しかし、ユーザーは、getItem(position)がnullを返すためにNullPointerExceptionを引き起こす項目をクリックします。

私の実装に何か問題はありますか?

アダプタ:

// There will be more than 1000 items, so the SparseArray will face the performance problem. That's why I choose to use Map. 
private Map<Integer, ArticleBean> articleBeans; 
private Map<Integer, Integer> articleSerials = new LinkedHashMap<>(); 

@Override 
public void onBindViewHolder(ItemHolder holder, int position) { 
    ArticleBean articleBean = articleBeans.get(position); 
} 

public ArticleBean getItem(int position){ 
    return articleBeans.get(position); 
} 

public void addItem(ArticleBean articleBean){ 
    if(!articleSerials.containsKey(serial)){ 
     articleSerials.put(serial, articleBeans.size()); 
    } 
    else{ 
     return; 
    } 
    articleBeans.put(articleBeans.size(), articleBean); 
} 

のonClickコールバック:ユーザーが項目をクリックすることができれば

@Override 
public void onClick(View view, int position) { 
    // returns null 
    ArticleBean articleBean = mAdapter.getItem(position); 
} 

私は意味は、どのようにそれがnullでしょうか?

答えて

0

この問題は、ユーザーがpullToRefresh機能を使用して同時に項目をクリックしているときにのみ発生します。

onRefreshはアニメーション終了後に呼び出されます。そして私はデータセットをクリアし、このメソッドでrecyclerAdapterのnotifyDataSetChangedを呼び出します。 しかし、notifyDataSetChangedはasycTaskですので、onRefreshを実行してください。 データセットがクリアされていてもビューが更新されていない場合は、ユーザがアイテムをクリックするとNullPointerExceptionがスローされます。

この行をonClickメソッドに追加して、dataSetが空でないことを確認するだけです。

if(mAdapter.getItemCount() == 0) return; 
関連する問題