2016-10-13 4 views
0

Ich benutze RecyclerView.Adapter, um mehrere ViewHolder mit verschiedenen Nachrichten anzuzeigen. Dies ist die onBindViewHolder Funktion:onClickListener Funktionen unter OnBindViewHolder gibt seltsame Ergebnisse

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    holder.submitButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     holder.messageTextView.setText("Updated message"); 
    } 
    }); 
} 

Die seltsame Sache, dass passiert ist, dass, wenn ich submitButton am 1. ViewHolder drücken, dann wird die Nachricht auf mich als „Aktualisierte Meldung“ angezeigt, aber wenn ich dann nach unten scrollen zu anderen ViewHolders, Der 5. ViewHolder enthält auch "Aktualisierte Nachricht" und die 9., 13. usw. haben bereits die Nachricht auf ihnen angezeigt. Ähnlich, wenn ich den submitButton auf dem 2. ViewHolder drücke, wird die Nachricht am 2., 6., 10., 14. usw. angezeigt.

Idealerweise sollte es so funktionieren, wenn ich den submitButton auf den 1. ViewHolder drücke, sollte die Nachricht nur auf dem 1. ViewHolder und nicht anderen angezeigt werden.

Ich hatte den Parameter ViewHolder Halter als letzte so zu setzen, dass ich es in der inneren Klasse von onClick Funktion aufrufen können.

Ich habe keine Ahnung, warum dies geschieht, und ich habe noch nie onBindViewHolder Funktionen vor, aber ich fühle es etwas das Argument ViewHolder Inhaber sein „final“ verwandt ist.

Antwort

1

Das Problem liegt an der Wiederverwendung von ViewHolder. Beim Scrollen der Zellen werden Sie wiederverwendet und nicht neu erstellt.

Der Adapter erstellt eine Anzahl von Zellen, die den sichtbaren Zellen entsprechen, und wenn das Bildlauffenster immer wieder verwendet wird.

sollten Sie sparen es irgendwo solche Positionen der Textview aktualisiert haben, und fügen Sie onBindViewHolder einen Scheck in, um zu sehen, wenn Sie den Text der Textview zu leeren String oder „Aktualisierte Meldung“ basierend festlegen müssen auf der Position

+0

Ich habs! So kann ich einfach überprüfen, ob für eine Position die Schaltfläche geklickt wurde, dann wird nur die Nachricht über onCreate dieses ViewHolders angezeigt. Ich wusste nichts von der Wiederverwendung von ViewHolders. Vielen Dank! –

Verwandte Themen