2016-03-31 8 views
2

Ich habe im Grunde alles in einem Layout, das alles für den Haupt-Feed meiner App benötigt hat. Alle variablen Elemente (Bilder, Video-Miniaturbilder usw.) werden zuerst auf GONE gesetzt und bei Bedarf auf VISIBLE gesetzt.Android - RecyclerView mit einem Layout, mehrere setVisibility

Das Problem ist manchmal, kann auf RecyclerView Recycling-Verhalten sein, das Element, das GONE sein soll, ist VISIBLE an den falschen Stellen.

Beispiel:

Artikel-Nr 1 Text

Artikel Bild

Artikel-Nr 2 enthält keine 3 Bild

enthält Ich halte rollier x Punkt nach unten, dann scroll wieder hoch und hier ist, was ich bekomme:

Artikel-Nr 1 enthält: Bilddatei von Elemente keine x, manchmal Art.-Nr. 3

Artikel-Nr 2 Bild

Artikel enthalten keine 3 Bild

Ich verwende einen benutzerdefinierten ViewHolder enthalten die extends RecyclerView.ViewHolder . Der Zweck der CustomViewHolder ist für Layout-Deklaration und Initialisierung.

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

Ein Beispiel, wie ich das Bild laden:

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

ich jede Sicht auf GONE festgelegt haben, wenn keine URL von dem Server erhalten wird

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

Aber irgendwie das Bild wird immer noch auf die vorherigen Artikel (ja, nicht nur Artikel Nr. 1) wiederverwendet. Manchmal sind auch Bilder in der falschen ImageView. Image D soll in ImageView D sein, aber es ist in ImageView A stattdessen.

Irgendwelche Anleitungen zum Einstellen RecyclerView und gehen gut?

Wenn ich etwas vermissen, oder brauchen mehr Code zu liefern, bitte ich Sie informieren: D

Antwort

6

Sie müssen auch die else Zustand versetzen. Wie im folgenden Beispiel.

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

Tun Sie dies für jedes der Elemente, die Sie dort als Listenelement für den Fall haben von euch ihre Sichtbarkeiten im laufenden Betrieb sind einstellen.

+3

Es könnte sich lohnen zu sagen, warum dies wichtig ist. Der Grund dafür ist, dass Inhaber wiederverwendet werden. – Knossos

+0

Ich habe nur Gedanken geschlagen. Danke, Reaz, dass du mir gesagt hast, dass ich etwas anderes machen soll, und danke @Knossos, dass du mir gesagt hast, dass die Inhaber wiederverwendet werden! Also die Sichtbarkeit innerhalb der Halter Nummer .. 3 zum Beispiel ist noch da, auch wenn wir zu Halter Nummer 1 bewegen? –

+0

@Knossos Vielen Dank für Ihre hinzufügen. Ja, das ist es wert, geteilt zu werden. –

Verwandte Themen