2010-08-20 4 views

Répondre

72

CursorAdapter présente une mise en œuvre de getView() que les délégués à newView()bindView() et, de telle manière que applique le motif de recyclage de la ligne. Par conséquent, vous n'avez pas besoin de faire quelque chose de spécial avec un CursorAdapter pour le recyclage des lignes si vous surchargez newView() et bindView().

+6

Comment appliquer le pattern ViewHolder? Est-ce que je le partagerais entre newView() et bindView()? –

+17

@Scienceprodigy: Dans 'newView()', vous devez créer 'ViewHolder' pour la ligne et l'associer à' setTag() '. Dans 'bindView()', vous récupérerez 'ViewHolder' via' getTag() '. – CommonsWare

+0

Merci, ça fonctionne. J'ai un peu de mal avec le recyclage des vues, parce que j'ai des éléments de liste qui ont un en-tête qui est passé par défaut, que j'utilise pour afficher les sections datées. Tout se montre bien jusqu'à ce que je lance la liste vers le haut ou vers le bas, puis il y a des en-têtes qui montrent où ils ne devraient pas être. –

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

Ce code source CursorAdapter, clairement cursorAdapter, fonctionne davantage.

2

La mise en œuvre CursorAdapter est différent des sous-classes adaptateurs réguliers comme BaseAdapter, vous n'avez pas besoin de passer outre getView(), getCount(), getItemId() parce que ces informations peuvent être récupérées à partir du curseur lui-même.

donné une Cursor, il vous suffit de passer outre deux méthodes pour créer une sous-classe CursorAdapter:

bindView(): Étant donné une vue, le mettre à jour pour afficher les données dans le curseur fourni.

newView(): Ceci est appelé pour activer une nouvelle vue qui va dans la liste. Le CursorAdapter prendra en charge le recyclage des vues (contrairement à la méthode getView() sur le Adapter). Il n'appelle pas le newView() chaque fois qu'il a besoin d'une nouvelle ligne. S'il a déjà un View (pas null), il appellera directement le bindView(), de cette façon, la vue créée est réutilisée. En divisant la création et la population de chaque vue en ces deux méthodes, le CursorAdapter atteint la réutilisation de la vue où, comme dans les adaptateurs classiques, ces deux choses sont effectuées dans la méthode getView().

+2

Merci, très utile. – LarsH

Questions connexes