2010-08-20 16 views

risposta

72

CursorAdapter ha un'implementazione di getView() che delega a newView() e bindView(), in modo da impone il modello fila riciclaggio. Quindi, non è necessario eseguire operazioni speciali con lo CursorAdapter per il riciclaggio di file se si sta eseguendo l'override di newView() e bindView().

+6

Come si applica il motivo ViewHolder? Lo avrei diviso tra newView() e bindView()? –

+17

@Scienceprodigy: In 'newView()', crei il 'ViewHolder' per la riga e lo associ a' setTag() '. In 'bindView()', si recupera 'ViewHolder' tramite' getTag() '. – CommonsWare

+0

Grazie, funziona. Però ho un po 'di problemi con il riciclo delle viste, perché ho degli elementi di lista che hanno un'intestazione che è DISPONIBILE per impostazione predefinita, che uso per visualizzare le sezioni datate. Tutto si mostra bene fino a quando lancio la lista verso l'alto o verso il basso, poi ci sono le intestazioni che mostrano dove non dovrebbero essere. –

18
/** 
    * @see android.widget.ListAdapter#getView(int, View, ViewGroup) 
    */ 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (!mDataValid) { 
      throw new IllegalStateException("this should only be called when the cursor is valid"); 
     } 
     if (!mCursor.moveToPosition(position)) { 
      throw new IllegalStateException("couldn't move cursor to position " + position); 
     } 
     View v; 
     if (convertView == null) { 
      v = newView(mContext, mCursor, parent); 
     } else { 
      v = convertView; 
     } 
     bindView(v, mContext, mCursor); 
     return v; 
    } 

Questo codice sorgente CursorAdapter, chiaramente CursorAdapter lavorare di più.

2

Il CursorAdapter implementazione è diversa da adattatori normali sub-classificare come BaseAdapter, non è necessario eseguire l'override getView(), getCount(), getItemId() perché tali informazioni possono essere recuperate dal cursore stesso.

Dato un Cursor, è sufficiente sostituire due metodi per creare una sottoclasse CursorAdapter:

bindView(): Dato un vista, aggiornarlo per visualizzare i dati nel cursore fornito.

newView(): Questo viene chiamato per costruire una nuova vista che entra nell'elenco.

Il CursorAdapter si prenderà cura di riciclaggio di vista (a differenza del metodo getView() sul regolare Adapter). Non chiama lo newView() ogni volta che ha bisogno di una nuova riga. Se ha già un (non null), chiamerà direttamente lo bindView(), in questo modo, la vista creata verrà riutilizzata. Suddividendo la creazione e la popolazione di ciascuna vista in questi due metodi, lo CursorAdapter consente di riutilizzare la vista dove, come negli adattatori regolari, entrambe queste operazioni vengono eseguite nel metodo getView().

+2

Grazie, molto utile. – LarsH

Problemi correlati