2016-03-31 80 views
2

我基本上都在一個佈局,其中有我的應用程序的主要飼料所需的一切。所有可變項目(圖像,視頻縮略圖等)首先設置爲GONE,當需要時設置爲VISIBLEAndroid - RecyclerView與一個佈局,多setVisibility

問題有時可能是由於RecyclerView的回收行爲,應該是GONE的項目是VISIBLE錯誤的地方。

實施例:

貨號1包含文本

貨號2包含圖像

貨號3包含圖片

我不斷向下滾動項的NO x,然後向上滾動,這裏是我得到的:

貨號1包含圖像從項目的NO x,有時沒有項目3

貨號2包含圖像

貨號3包含圖片

我使用的自定義ViewHolder其中extends RecyclerView.ViewHolderCustomViewHolder的用途是用於佈局聲明和初始化。

ProgressBar progressBar; 
    View viewDimmer; 
    RelativeLayout postListWrapper; 

    ... 

    public ObjectViewHolder(View v) { 
     super(v); 
     progressBar = (ProgressBar)v.findViewById(R.id.post_inscroll_progressBar); 
     viewDimmer = (View)v.findViewById(R.id.post_inscroll_viewDimmer); 
     postListWrapper = (RelativeLayout)v.findViewById(R.id.post_inscroll_postListWrapper); 
    } 

的我是如何加載圖像的一個例子:

Picasso.with(context) 
    .load(youtubeThumbnailUrl) 
    .fit() 
    .centerCrop() 
    .into(
     ((ObjectViewHolder) holder).userPostYoutubeImage 
    ); 

我已經設置每個能見度GONE如果從服務器

((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE); 
((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE); 

沒有獲得URL但不知何故,圖像仍然在以前的項目上重複使用(是的,不僅是產品編號1)。有時圖片也出錯了ImageView。圖像D應該在ImageView D中,但它代替ImageView A.

任何設置RecyclerView的指南都很好嗎?

如果我錯過了什麼,或者需要提供更多的代碼,請你告訴我:d

回答

6

你需要把else條件了。像下面的例子。

// if no url is found from server 
if(url == null){ 
    ((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE); 
    ((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE); 

} else { 
    // Some url has found 
    ((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.VISIBLE); 
    ((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.VISIBLE); 
} 

這樣做對每個你得有作爲的情況下列表項的你在運行時設置其可見性的項目。

+3

這可能值得說明爲什麼這很重要。原因是持有人被重複使用。 – Knossos

+0

我只是被打了一巴掌。謝謝Reaz告訴我使用其他方式,謝謝@Knossos告訴我持有者已被重用!因此,即使我們移動到1號持有人,持有人號碼3內的可見性仍然存在。 –

+0

@Knossos非常感謝您的補充。是的,這是值得分享的。 –