2012-08-02 2 views
3

J'ai un ListView très simple maintenant dans un ListActivity qui affiche juste une liste de valeurs de texte. Voici mon code actuel:Un ListView peut-il avoir deux ou plusieurs types de disposition de ligne différents dans Android?

public class InfoActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     List<String> values = new ArrayList<String>(); 
     // loads up the values array here 
     // ... 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values); 
     setListAdapter(adapter); 
    } 

Mon fichier XML pour InfoActivity n'a rien parce que je me sers d'un ListActivity.

Ce que je veux faire faire des dispositions personnalisées pour les lignes. Les 5 premières lignes auront layoutA.xml et les 5 autres lignes auront layoutB.xml.

Comment faire? Je suis perdu sur par où commencer. Évidemment, je cherche le code le plus simple possible.

+0

double possible: http://stackoverflow.com/questions/4777272/android-listview-with-different-layout-for-each-row – Ixx

Répondre

2

C'est assez facile, il vous suffit simplement d'étendre ArrayAdapter. Mon ArrayAdapter fait deux choses différemment:

  • au lieu de passer un ResourceId, mon adaptateur prendre un tableau de
  • ResourceIds
  • getView() vérifie la position et charge la ressource appropriée

Ceci est un trivial Exemple. Si vous envisagez de le rendre plus complexe que la première moitié ne l'est pas et que la seconde moitié est différente, vous devez remplacer getViewTypeCount() et getItemViewType().

Exemple de travail:

public class Example extends Activity { 
    public class MyArrayAdapter<T> extends ArrayAdapter<T> { 
     LayoutInflater mInflater; 
     int[] mLayoutResourceIds; 

     public MyArrayAdapter(Context context, int[] textViewResourceId, List<T> objects) { 
      super(context, textViewResourceId[0], objects); 
      mInflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 
      mLayoutResourceIds = textViewResourceId; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null && position > 2) 
       convertView = mInflater.inflate(mLayoutResourceIds[1], parent, false); 
      return super.getView(position, convertView, parent); 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String[] array = new String[] {"one", "two", "three", "four", "five", "six"}; 
     List<String> list = new ArrayList<String>(); 
     Collections.addAll(list, array); 

     ListView listView = new ListView(this); 
     listView.setAdapter(new MyArrayAdapter<String>(this, new int[] {android.R.layout.simple_list_item_1, android.R.layout.simple_list_item_single_choice}, list)); 
     setContentView(listView); 
    } 
} 
0

Je crois que si vous avez un compteur, dire à partir de 0, puis Gonfler et réutiliser les cinq premiers avec layoutA.xml, puis lorsque son à 5, la ferraille layoutA.xml avec layoutB.xml gonflé. Cela devrait être assez simple à faire. Bien sûr, je parle de cela à travers BaseAdapter, ce qui vous permet de faire un adaptateur qui définit chaque ligne dans le ListView. Je n'ai jamais utilisé ListActivity. Mais le processus devrait être le même. Juste pour ajouter à ce que @lxx a posté, le lien que je veux dire, il vous aidera certainement à comprendre comment accomplir ce que vous voulez. Bien que je dirais que c'est exagéré à mon avis d'utiliser ces méthodes quand vous voulez 5 d'un type, et 5 d'un autre. Définitivement utiliser ce lien comme une bonne ligne de base, mais juste utiliser un compteur. C'est plus simple. En termes de mémoire, ne faites que gonfler la mise en page lorsque vous savez que le compteur a déjà placé 5 vues. De cette façon, vous ne le faites pas à chaque fois.

2

Ceci est un excellent article de blog sur la mise en page différente pour vos éléments de liste.

handling-listviews-with-multiple-row-types

Il y a aussi le projet d'exemple afin que vous puissiez configurer et essayer l'exemple.

0

Vous pouvez essayer d'utiliser MergeAdapter (CWAC-fusion), où dans un ListView vous pouvez avoir plusieurs adaptateurs avec différentes mises en page.

0

Si nous avons besoin d'afficher un type de vue différent dans la vue liste, il est bon d'utiliser getViewTypeCount() et getItemViewType() dans l'adaptateur au lieu de basculer une vue VIEW.GONE et VIEW.VISIBLE peuvent être une tâche très coûteuse dans getView() qui affectera le défilement de la liste.

Veuillez cocher celui-ci pour l'utilisation de getViewTypeCount() et getItemViewType() dans Adapter.

Lien: the-use-of-getviewtypecount

Questions connexes