2010-03-08 5 views
0

Je commence juste avec le SDK Android et j'ai eu une question rapide. J'essaye de mettre en place un ListView avec un rectangle de couleur sur la gauche et puis un peu de texte pour chaque rangée. Je veux aussi faire en sorte que je puisse cliquer sur chaque entrée de la liste et ouvrir une nouvelle activité pour afficher certaines informations (similaire à la liste de contacts). Quelqu'un at-il des exemples pour m'aider?Utilisation de ListViews sur Android?

Répondre

1

Si vous cherchez à éviter de sous-classer BaseAdapter mais que vous voulez travailler avec des affichages d'éléments personnalisés et une logique de clic d'objet personnalisée basée sur un objet, voici ce que j'ai fait.

Dans mon code, je travaille avec une collection d'objets de modèles. Je veux afficher cette collection d'objets de modèle dans un ListView. Je ne peux pas simplement passer une ArrayList de ModelObjects dans un SimpleAdapter car il attend une liste de paires clé-valeur (quelque chose comme List<Map<String, Object>>). Ainsi, au lieu d'utiliser une simple collection de mon objet dans mon application, j'ai créé une classe personnalisée pour représenter ma collection qui dérive simplement de la structure que j'utilisais. De cette façon, je peux continuer à l'utiliser comme je l'étais, mais je peux ajouter une méthode qui le transforme d'une collection conviviale en code en une collection SimpleAdapter-friendly. Dans mon cas, j'utilisais un HashMap avec une certaine propriété de chaîne (par exemple HashMap<String, ModelObject>). Ma classe de collection personnalisée serait ModelObjects (pluriel) s'étend . ModelObjects contiendrait alors une méthode ToList() où je transformerais mes objets en ArrayList<? extends HashMap<String, ?>> que je pourrais ensuite passer au constructeur SimpleAdapter pour l'afficher dans une liste avec une vue personnalisée.

Alors maintenant, je peux construire un SimpleAdapter avec les cinq paramètres suivants:

  1. Le contexte de ma liste (dans mon cas, l'activité contenant)
  2. Ma liste (décrit ci-dessus)
  3. Le ID de ma disposition personnalisée pour ces éléments (R.layout.custom_list_item)
  4. Un tableau de chaînes de noms de propriété. Ce sont les clés de la HashMap de ma méthode ToList.
  5. Un tableau int qui associe les propriétés de chaque élément ci-dessus (n ° 4) à un élément dérivé View-id dans ma mise en page personnalisée

Ensuite, dans ma méthode de OnItemClickListener.onItemClick, je peux utiliser arg3 pour obtenir la position de l'article dans ma liste qui a été cliquée et l'utiliser pour choisir l'objet de ma collection. Vous pouvez agir sur toutes les propriétés de votre objet ou faire un gros commutateur/casse sur une propriété de votre objet pour lancer une activité particulière ou quelque chose comme ça.

La seule astuce consiste à stocker une copie locale de votre collection dans l'activité qui n'a pas été modifiée. Sinon, vous pourriez rechercher un objet par id dans onItemClick et obtenir un objet différent de ce que vous attendez. C'est peut-être un peu hors contexte, mais voici à quoi ressemble mon code:

ListView lvArtists = (ListView)findViewById(R.id.lvArtists); 
    SimpleAdapter adapter = new SimpleAdapter(
      this, 
      artists.ToList(), 
      R.layout.artist_list_item, 
      new String[] { "name", "imageIdSmall", "tracksCount", "tracksPending" }, 
      new int[] { R.id.artistListItemName, R.id.artistListItemImage, R.id.artistListItemAudioClips, R.id.artistListItemAudioClipsPending } 
      ); 
    lvArtists.setAdapter(adapter); 
    lvArtists.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      Artist artist = artists.getSortedItem((int)arg3); 
      mArtistDialog.setArtist(artist); 
      mArtistDialog.show();    
     } 
    }); 
Questions connexes