3

以下是onBindViewHolderViewHolder在RecyclerView.Adapter沒有具體定位

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    // - get element from your dataset at this position 
    StatusItem item = mDataset.get(position); 
    //...... 
    //Add content and timing to the textview 
    String content = item.getContent(); 

    holder.mTextViewTime.setText(timing); 
    //Set the img 
    holder.imgViewIcon.setImageDrawable(item.getProfileDrawable()); 
    //Set content image (for Instagram) 
    holder.mImageViewContentPic.setImageDrawable(item.getContentDrawable()); 
    //HIDE THE VIEW Start 
    if(item.getContentDrawable() == null){ 
     holder.mImageViewContentPic.setVisibility(View.GONE); 
    } 
    //HIDE THE VIEW End 
} 

如預期的部分HIDE THE VIEW不工作的我的代碼部分(內側MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>)。 當我向下滾動時,視圖正常工作。但是,當我開始向上滾動,即重新訪問先前的視圖時,應該是VISIBLE的ImageView會變成GONE,儘管我檢查了我的數據集並驗證了它未被修改。嘗試調用視圖上的其他方法也會導致不穩定的結果(數據集中的位置和項目不匹配)。

看來,持有人沒有綁定到RecyclerView內的特定位置。

如果我刪除HIDE THE VIEW部件,代碼將按預期工作。 有什麼辦法解決這個問題,並動態地隱藏在我的情況下的意見?

注意:我使用了一些AsyncTasks來更新數據集並調用notifyDataSetChanged()(如果相關的話)。

+0

ViewHolder不應該是特定於位置。即,如果您有100個項目,則沒有100個ViewHolders。改寫適配器中的bindView方法(我記不清確切的名稱),以改變位置的可見性。 – harism 2014-09-27 16:22:16

+0

似乎無法在'RecyclerView.Adapter'中找到此類方法。 – paradite 2014-09-27 16:30:53

回答

8
###This is the solution to your problem:### 

holder.mImageViewContentPic.setVisibility(View.VISIBLE); 
if(item.getContentDrawable() == null){ 
     holder.mImageViewContentPic.setVisibility(View.GONE); 
    } 
+0

謝謝。這工作。可以進一步解釋爲什麼這會起作用? – paradite 2014-09-27 16:23:52

+0

這是實施視圖持有者模式的情況。它每次都使用相同的視圖,或者您可以重新使用該視圖,因此視圖中的視圖將保持消失,這是爲什麼您必須重新使其可見。使用這些可重用的視圖有許多技巧,並希望在不久的將來您能找到它們。 – 2014-09-27 16:57:32

+0

好吧我想我有'可重複使用的視圖'的想法 – paradite 2014-09-27 16:58:57

0

由於RecyclerView使用回收的非常好,ViewHolder一個可以用來爲ViewHolder B,所以你需要一個特定的ViewHolder每個屬性的情況下,一些屬性附加到錯誤的對象。