2016-12-03 2 views
0

Как это возможно?Android - recyclerAdapter.getItem возвращает null в обратном вызове onClick

Адаптер использует положение для привязки держателя вида, чтобы пользователь мог видеть вид элемента на экране.

Но тогда пользователь нажимает на элемент, который вызывает исключение NullPointerException из-за того, что getItem (position) возвращает null.

Есть ли что-то не так с моей реализацией?

Адаптер:

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

Я имею в виду, если пользователь может выбрать пункт, как это было бы пустым?

ответ

0

Эта проблема возникает только в том случае, если пользователь использует функцию pullToRefresh и одновременно щелкнет элемент.

onRefresh будет вызываться после окончания анимации. И я очищаю свой набор данных и вызываю notifyDataSetChanged recyclerAdapter в этом методе. Но notifyDataSetChanged является asycTask, также как и onRefresh. Если dataSet был очищен, но представление не было обновлено, NullPointerException будет выбрано, когда пользователь нажмет на элемент.

Так что все, что мне нужно сделать, это добавить эту строку в метод onClick, чтобы убедиться, что dataSet не пуст.

if(mAdapter.getItemCount() == 0) return; 
Смежные вопросы