2016-12-03 49 views
0

這怎麼可能?Android - recyclerAdapter.getItem在onClick回調函數中返回null

適配器使用位置綁定視圖保持器,因此用戶可以在屏幕上看到項目視圖。

但是,然後用戶單擊由於getItem(位置)返回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); 
} 

我的意思是,如果用戶可以點擊該項目,怎麼會是空?

回答

0

此問題只發生在用戶使用pullToRefresh功能並同時單擊該項目時。

onRefresh將在動畫結束後調用。我清除了我的dataSet,然後在這個方法中調用recyclerAdapter的notifyDataSetChanged。 但notifyDataSetChanged是一個asycTask,所以onRefresh也是如此。 如果dataSet已被清除,但視圖尚未刷新,則用戶單擊該項目時將拋出NullPointerException

因此,我所要做的就是將此行添加到onClick方法中,以確保dataSet不爲空。

if(mAdapter.getItemCount() == 0) return;