2016-03-31 14 views
2

私のアプリのメインフィードに必要なものはすべて基本的にオールインワンレイアウトです。すべての変数項目(画像、ビデオサムネイルなど)は、最初にGONEに設定され、必要に応じてVISIBLEに設定されます。1つのレイアウト、複数のsetVisibilityを持つAndroid - RecyclerView

RecyclerViewさんのリサイクルの問題が原因で問題が発生することがあります。GONEとされているアイテムは、間違った場所にあるVISIBLEです。

例:なし1はテキスト

項目が何も2イメージ

項目NO 3イメージ

が含まれていない含まれていない私は、項目にNO xを下にスクロールしません保つ含まれていません

項目スクロールバックして、ここに私が得るもの:

商品番号1は時々アイテムなし3

項目は何の2は何の3私はextends RecyclerView.ViewHolderカスタムViewHolderを使用している画像

が含まれていない画像

項目が含まれていない、項目からNO xを画像が含まれていません。 CustomViewHolderの目的は、レイアウトの宣言と初期化です。 URLがサーバー

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

しかし、何とか画像から得られない場合、私はGONEに各可視性を設定している

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

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

私はイメージをロードする方法の例前の項目(はい、項目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に感謝し、Holdersが再利用されたことを伝えるために@Knossosに感謝します!したがって、ホルダー番号1内に移動しても、ホルダー番号3内の視認性はまだありますか? –

+0

@Knossosあなたのご協力ありがとうございました。はい、これは分かち合う価値があります。 –

関連する問題