2016-04-24 16 views
12

Nel mio onBindViewHolder del mio RecyclerView.Adapter<SearchAdapter.ViewHolder> quando l'utente fa clic su cardview un pulsante diventa visibile. Ma quando sto scorrendo la vista del riciclo, anche alcuni pulsanti di altri elementi sono mostrati come visibili. Perché sta succedendo?Elementi di recyclerview confusi

questo è il mio codice:

@Override 
public void onBindViewHolder(final ViewHolder viewHolder, final int position) { 
    viewHolder.card.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (viewHolder.content_layout.getVisibility() == View.VISIBLE) { 
       viewHolder.content_layout.setVisibility(View.GONE); 
       viewHolder.address.setMaxLines(2); 
       viewHolder.attribute.setMaxLines(2); 
      } else { 
       viewHolder.content_layout.setVisibility(View.VISIBLE); 
       viewHolder.address.setMaxLines(8); 
       viewHolder.attribute.setMaxLines(8); 
      } 
     } 
    }); 
    ... 
} 
+0

Si prega di inviare il vostro codice qui –

+0

pubblicato @akhilRao –

risposta

10

Dopo aver iniziato a scorrere verso il basso nell'elenco, le viste vengono riciclate. Ciò significa che un ViewHolder precedentemente gonfiato (alcuni creati in onCreateViewHolder) vengono riutilizzati.
Quindi, ciò che devi fare è ricordare le posizioni su cui è stato fatto clic (ad esempio tramite SparseBooleanArray) e controllare in onBindViewHolder se la vista deve essere visibile (precedentemente selezionata) o meno.

è possibile trovare un esempio di utilizzo di base del SparseBooleanArray in this StackOverflow posta

+0

grazie che hanno risolto –

2

creare una matrice per esempio di matrice booleana, e quando ogni posizione cliccato, impostare vero in stessa posizione di array. e in onBindViewHolder controlla se quell'array [posizione] è vero imposta quella voce visibile se.

+0

sto facendo che con 'arraylist.get (posizione) .type' –

6

I pulsanti 'altri' elementi visibili sono quelli che utilizzano la stessa viewholder che è stato modificato nel callback. Quindi perché viewholders (e viste) vengono riciclati:

  • Dovrebbero memorizzare solo le informazioni che possono essere recuperati ogni volta che il viewholder è destinato a una posizione.

  • tutto ciò che può essere cambiato nello stato di vista deve essere aggiornata in onBindViewHolder()

Nel tuo caso si dovrebbe memorizzare il 'viene selezionato' da qualche altra parte e ripristinare la visibilità e maxLines a onBindViewHolder() (non solo nella richiamata)

5

La buona idea è di creare un oggetto di classe con tutti i dati necessari per un elemento in visualizzazione recycler, inoltre aggiungere un booleano isItemWasClicked e all'interno di onBindViewHolder() controllare questo booleano e creare pulsanti v è o non è possibile Per esempio:

public class OneItemOfList{ 
    int priceToDisplay; 
    String name; 
    String date; 
    boolean wasClicked; 
} 

public class YourAdapter extends RecyclerView.Adapter<OneItemOfList.ViewHolder> { 
ArrayList<OneItemOfList> items; 
... 
@Override 
public void onBindViewHolder(ViewHolder viewHolder, final int position) { 
    viewHolder.view.setText(items.get(position).name); 
    if (items.get(position).wasClicked) 
     viewHolder.button.setVisible(View.VISIBLE); 
    else 
     viewHolder.button.setVisible(View.GONE); 
    viewHolder.view2.setOnClickListener(... 
     OnClick(...){ 
      items.get(position).wasClicked = !items.get(position).wasClicked; 
     }); 
} 
... 
} 
+0

Buona idea, grazie –

Problemi correlati