342 votes

Android Listview avec une présentation différente pour chaque ligne

Je suis en train de déterminer le meilleur moyen d’avoir un seul listview contient des styles de lignes différentes. Je sais comment faire pour créer une ligne personnalisée + adaptateur tableau personnalisé pour soutenir une ligne personnalisée pour l’affichage de la liste entière. Mais comment peut un listview prend en charge plusieurs styles de ligne différentes ?

410voto

Cristian Points 92147

Puisque vous savez combien de types de mise en page qui vous serait - il possible d'utiliser ces méthodes.

getViewTypeCount() - cette méthode retourne les informations combien de types de lignes que vous avez dans votre liste

getItemViewType(int position) - retourne des informations de mise en page type, vous devez utiliser en fonction de la position

Ensuite, vous exagérez la mise en page uniquement si elle est null et de déterminer le type à l'aide d' getItemViewType.

Regardez ce tutoriel pour plus d'informations.

Pour réaliser des optimisations dans la structure que vous avez décrit dans le commentaire que je vous suggère:

  • Le stockage de vues d'objets appelés ViewHolder. Il serait d'augmenter la vitesse, car vous n'aurez pas à appeler findViewById() tous les temps, en getView méthode. Voir List14 de l'API de démos.
  • Créer un générique de mise en page qui sera conforme à toutes les combinaisons de propriétés et de cacher certains éléments si la position actuelle ne l'a pas.

J'espère que cela va vous aider. Si vous pouvez fournir certaines XML talon avec la structure de données et de l'information exactement comment vous souhaitez la carte en ligne, je serais en mesure de vous donner plus de précision conseiller. Par pixel.

62voto

Bert F Points 27237

Je sais comment créer une ligne personnalisée + coutume adaptateur tableau à l'appui d'une ligne personnalisée pour l'ensemble de l'affichage de la liste. Mais comment peut-on listview soutenir une multitude de lignes de styles?

Vous connaissez déjà les bases. Vous avez juste besoin d'obtenir votre coutume adaptateur pour retourner un autre modèle/vue en fonction de la ligne du curseur ou de l'information fournie.

Un ListView peut prendre en charge plusieurs ligne styles, car il découle de l' AdapterView:

Un AdapterView est une vue dont les enfants sont déterminés par un Adaptateur.

Si vous regardez la Carte, vous verrez méthodes qui compte pour l'utilisation de lignes de vues:

abstract int getViewTypeCount()
// Returns the number of types of Views that will be created ...

abstract int getItemViewType(int position)
// Get the type of View that will be created ...

abstract View getView(int position, View convertView, ViewGroup parent)
// Get a View that displays the data ...

Les deux dernières méthodes fournissent la position de sorte que vous pouvez utiliser pour déterminer le type de vue que vous devez utiliser pour cette ligne.


Bien sûr, vous n'avez généralement pas utiliser AdapterView et l'Adaptateur directement, mais plutôt d'utiliser ou de dériver de l'un de leurs sous-classes. Les sous-classes de la Carte peut ajouter des fonctionnalités supplémentaires qui changent de la façon d'obtenir des mises en page personnalisées pour des lignes différentes. Depuis la vue utilisée pour une ligne donnée est alimentée par l'adaptateur, l'astuce est d'avoir la carte pour revenir à la vue souhaitée pour une ligne donnée. Comment faire cela diffère en fonction de l'adaptateur spécifique.

Par exemple, pour utiliser ArrayAdapter,

  • remplacer getView() à gonfler, remplir et retourner à la vue souhaitée pour la position donnée. L' getView() méthode inclut la possibilité de réutiliser les opinions par l' convertView paramètre.

Mais à l'utilisation des dérivés de CursorAdapter,

  • remplacer newView() à gonfler, remplir et retourner à la vue souhaitée pour le curseur de l'état (c'est à dire la "ligne") [vous devez également remplacer bindView alors que le widget peut réutiliser vues]

Toutefois, pour utiliser SimpleCursorAdapter,

  • définir un SimpleCursorAdapter.ViewBinder avec un setViewValue() méthode pour gonfler, remplir et retourner à la vue souhaitée pour une ligne donnée (actuelle du curseur de l'état) et les données de la colonne "de". La méthode peut définir le "spécial" points de vue et de reporter à SimpleCursorAdapter du comportement standard pour le "normal" liaisons.

Regardez les exemples/tutoriels pour le type de carte que vous utilisez en fin de compte.

14voto

Jems Points 5975

Dans votre tableau personnalisé adaptateur, vous remplacez la getView() la méthode, comme vous l'avez sans doute familier avec. Alors tout ce que vous avez à faire est d'utiliser un commutateur instruction ou une instruction if pour revenir à un certain Affichage personnalisé en fonction de la position de l'argument passé à la méthode getView. Android est intelligent en ce qu'elle ne fera que vous donner un convertView du type approprié pour votre poste/ligne; vous n'avez pas besoin de vérifier qu'il est du type correct. Vous pouvez aider à Android avec ce en remplaçant la getItemViewType() et getViewTypeCount() les méthodes de façon appropriée.

4voto

kyogs Points 2147

Si nous avons besoin afin de montrer les différents type d'affichage dans la liste de la vue et de son bon usage de getViewTypeCount() et getItemViewType() dans l'adaptateur à la place de la bascule d'un affichage.DISPARU et la VUE.VISIBLE peut être très cher à l'intérieur de getView() qui aura une incidence sur la liste de défilement.

Veuillez vérifier celui-ci pour l'utilisation de getViewTypeCount() et getItemViewType() dans l'Adaptateur.

Lien : l'utilisation de la getviewtypecount

1voto

Devon Points 134

Si vous êtes chinois, ou vous pouvez lire chinois, voici un article d’implémentation vraiment getItemViewType(int position) j’utilise son tutoriel pour terminer mon travail...

在Android的Listview中显示多种视图

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X