Donc, je regarde cette vidéo http://www.youtube.com/watch?v=N6YdwzAvwOA et Romain Guy montre comment rendre le code adaptateur d'interface utilisateur plus efficace en utilisant la méthode getView()
. Cela s'applique-t-il également à CursorAdapters? J'utilise actuellement bindView()
et newView()
pour mes adaptateurs de curseur personnalisés. Devrais-je utiliser getView à la place?GetView Vs. BindView dans un CursorAdapter personnalisé?
Répondre
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()
.
/**
* @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.
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()
.
Merci, très utile. – LarsH
- 1. findviewbyid() renvoie null - dans un CursorAdapter personnalisé bindview()
- 2. Appliquer ListView personnalisé pour un CursorAdapter
- 3. CursorAdapter vs ResourceCursorAdapter
- 4. Forcer le cursoradapter personnalisé à ne pas recycler les vues
- 5. comment combiner à la fois DISPLAY_NAME et NUMBER dans un CursorAdapter personnalisé?
- 6. Comment afficher uniquement des éléments spécifiques dans un CursorAdapter
- 7. Animer de nouvelles lignes dans ListView avec un CursorAdapter
- 8. android: styling ListView éléments de Custom CursorAdapter
- 9. Android: comment utiliser CursorAdapter?
- 10. Android Adaptateur multiple getView
- 11. Comment utiliser AnimationDrawable dans getView avec Gallery
- 12. Essayer de surcharger getView dans un SimpleCursorAdapter donne NullPointerExceptio
- 13. IIS 7 Journaux Vs Personnalisé
- 14. Comment mettre à jour un CursorAdapter lié à listview lorsque le nombre d'éléments change?
- 15. Séparateurs ListView à l'aide d'un CursorAdapter
- 16. Problème étrange: Galerie Widget n'appelle jamais getView
- 17. Lors de l'implémentation de bindView() pour un adaptateur, puis-je "ignorer" une vue?
- 18. 6 premiers éléments ListView sont continuellement invoqués avec getView()
- 19. Lorsque je fais défiler une liste avec un adaptateur personnalisé trop rapidement, getView() commence à se comporter bizarrement. Pourquoi?
- 20. Comment afficher toutes les autres chaînes dans View getView()?
- 21. VS Item Template Paramètre personnalisé compilé
- 22. Création d'un bouton de ruban personnalisé dans VS 2008 Standard
- 23. Comment modifier une légende sur un onglet pour un éditeur personnalisé dans VS Shell
- 24. Contrôle personnalisé ASP.NET dans VS - Comment faire le format VS correctement
- 25. CheckBox a vérifié l'état dans un ListView
- 26. Enregistrer un état d'instance ListView personnalisé?
- 27. Android, Adaptateur: Filtrer via getView() laisse toujours des lignes grises
- 28. registerClientScriptBlocage dans un gestionnaire personnalisé?
- 29. Comment faire face à CursorAdapter et de changer l'API Contacts?
- 30. problème android listview, passer outre getView() mais jamais être invoqué
Comment appliquer le pattern ViewHolder? Est-ce que je le partagerais entre newView() et bindView()? –
@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
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. –