Aller au contenu

ListView, équivalent IPhone


Pierre87

Recommended Posts

Salut !

Je bosse en ce moment sur un projet Android assez important...

Ayant vu ce que peut faire l'IPhone au niveau des "list view", je me suis demandé si il était possible de faire la même chose sur Android.

(je connais déjà assez bien les ListView, Adapter sur Android)

On m'a parlé de 3 choses sur IPhone : TableViewController, Section, Row

C'est surtout le principe de "section" qui m'intéresse.

Sur IPhone, on peut découper une "liste" en plusieurs "sections" qui contiennent elles même des "rows"

Peut on faire la même chose sur une ListView Android ?

J'ai vu dans Adapter un lien avec ViewGroup, ça pourrait être ce que je cherche ?

Merci !

Lien vers le commentaire
Partager sur d’autres sites

En fait il n'y a pas vraiment ce qu'on trouve sur iPhone tout simplement parce que sur iPhone cette notion de section est directment intégrée au framework. Une cellule n'est pas seulement déterminée par une position mais par un objet "NSIndexPath" qui est un couple de 2 valeurs : section et row.

L'ExpandableList est ce qui se rapproche le plus de la notion mais son comportement est un peu différent. Si tu souhaite vraiment avoir le même comportement, il faut faire comme dans mon post (cf réponse de neoakira).

Lien vers le commentaire
Partager sur d’autres sites

Dans le code de Cyril Mottier, ces lignes font toute la différence avec une liste basique :

               @Override
       public int getItemViewType(int position) {
           return (OBJECTS[position] instanceof String) ? ITEM_VIEW_TYPE_SEPARATOR
                   : ITEM_VIEW_TYPE_VIDEO;
       }

       @Override
       public boolean isEnabled(int position) {
           // A separator cannot be clicked !
           return getItemViewType(position) != ITEM_VIEW_TYPE_SEPARATOR;
       }

voir http://developer.android.com/reference/android/widget/BaseAdapter.html#getItemViewType%28int%29

Lien vers le commentaire
Partager sur d’autres sites

@thomas.l

oui oui je connais cette "astuce"

mais ça me fait vraiment bizarre d'employer ça pour des "en têtes", car le type de données n'est absolument pas le même

Je trouve cette technique plus adaptée dans le cas où les données sont "différentes mais pas trop"

Par exemple, dans une de mes application, j'avais une liste de connexions (wifi et bluetooth).

Donc pour stocker mes données, j'avais une bête liste qui contenait des connexions.

Par contre, pour afficher des en têtes, getItemViewType me fait un peu peur :/

Lien vers le commentaire
Partager sur d’autres sites

@Pierre87

Il existe d'autre façon de créer des titres de sections mais il faut vraiment comprendre que ça n'est pas une fonctionnalité que le framework prévoit comme cela peut être le cas sur iPhone. Néanmoins, comme le framework permet de faire à peu prés tout ce qu'on veut, il est bien sûr possible de "simuler" ces en-têtes.

Une autre solution qui est parfois employée c'est de n'avoir qu'un seul et unique type de cellule puis de cacher ou afficher la partie "header" de cette cellule en fonction de sa place de la section (affichée si première, cachée sinon). Cette technique permet d'éviter les "bidouilles" sur les types de vues mais à d'autres inconvénients comme par exemple un "list selector" qui est partiellement caché pour les cellules au header affiché. ... Ok, je pense que j'ai laché tout le monde là :( Bah sachez que c'est possible et ça peut donner de très bon résultat !

Lien vers le commentaire
Partager sur d’autres sites

Une autre solution qui est parfois employée c'est de n'avoir qu'un seul et unique type de cellule puis de cacher ou afficher la partie "header" de cette cellule en fonction de sa place de la section (affichée si première, cachée sinon). Cette technique permet d'éviter les "bidouilles" sur les types de vues mais à d'autres inconvénients comme par exemple un "list selector" qui est partiellement caché pour les cellules au header affiché. ... Ok, je pense que j'ai laché tout le monde là :( Bah sachez que c'est possible et ça peut donner de très bon résultat !

N'y-a-t-il pas des blagues du genre : l'en-tête reste clickable vu qu'elle "fait partie de la ligne du dessous" avec cette technique ?

Qui plus est, les composants masqués restent en mémoire et ça c'est moins bon (à la limite voir la technique de lazy init dans le xml ui mais sur une longue liste tous les composants en cache auront eu la chance d'afficher une fois un "premier de catégorie" et auront donc chargé le composant header).

Lien vers le commentaire
Partager sur d’autres sites

Une autre solution qui est parfois employée c'est de n'avoir qu'un seul et unique type de cellule puis de cacher ou afficher la partie "header" de cette cellule en fonction de sa place de la section (affichée si première' date=' cachée sinon). Cette technique permet d'éviter les "bidouilles" sur les types de vues mais à d'autres inconvénients comme par exemple un "list selector" qui est partiellement caché pour les cellules au header affiché. ... Ok, je pense que j'ai laché tout le monde là :( Bah sachez que c'est possible et ça peut donner de très bon résultat ![/quote']

N'y-a-t-il pas des blagues du genre : l'en-tête reste clickable vu qu'elle "fait partie de la ligne du dessous" avec cette technique ?

Qui plus est, les composants masqués restent en mémoire et ça c'est moins bon (à la limite voir la technique de lazy init dans le xml ui mais sur une longue liste tous les composants en cache auront eu la chance d'afficher une fois un "premier de catégorie" et auront donc chargé le composant header).

En effet, l'entête reste cliquable et c'est un bon point je trouve car ça évite les "rattages" de clics :)

Concernant l'empreinte mémoire c'est vraiment minime puisque qu'une ListView réutilise les vues et qu'au point de vue "measure" et "draw", les vues en visibilité "View.GONE" ne sont pas prise en compte.

Lien vers le commentaire
Partager sur d’autres sites

Finalement, j'ai choisi une solution un poil différente de celle proposée par Cyril.

J'ai une (ou plusieurs) ArrayList pour mes éléments "similaires".

Et j'inflate mes Views "uniques" à la création de mon Activity.

C'est mon Adapter qui se charge de calculer le "décalage"

En gros, dans ma ListView j'ai :

- une ligne de titre

- une ligne d'onglets

- un nombre de ligne variable en fonction de l'onglet choisi précédemment

C'est assez rapide, mais l'adapter a vraiment une sale gu***** :D

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...