web-dev-qa-db-fra.com

Comment dessiner un en-tête de section dans une vue de liste Android, comme le fait UITableview d'ios?

Je souhaite dessiner des en-têtes de section dans la liste de vues Android, tout comme l'application Contacts (...). Lorsque la liste a été déplacée, les en-têtes de section se déplacent à plat, merci.

15
stream

Il suffit de regarder ceci Android - En-têtes de sections dans ListViews exemple, il décrit bien comment implémenter des en-têtes de sections dans ListViews.

Et 

Android-amazing-listview

SeparatedListAdapter de Jeff Sharkey

MergeAdapter de CommonsWare

Merci.

19
user370305

Créez une disposition HEADER dans la disposition de votre élément de liste. Nous utilisons l’option VISIBILITY pour afficher et masquer le HEADER LAYOUT. Cela agira comme un en-tête de section.

Dans la méthode "getView" de l'adaptateur, vérifiez la première lettre du champ "nom (dans le cas que vous indiquez en accord avec Nom)" avec la première lettre du précédent "champ nom" de LIST ITEMS. Si cela cache la disposition HEADER LYOUT (avec une vue de texte), sinon affiche la disposition HEADER LAYOUT avec le texte d'en-tête indiquant la première lettre du champ de nom. 

Voici le code 

String nameFirstLetter = "A"; // Déclarez ceci globalement, pas à l'intérieur de getView.

// Dans le getView String nameF = Name.slice (0,1);

 if(!nameFirstLetter.equals(nameF )){
        nameFirstLetter = nameF ;           
        holder.headerText.setText(nameFirstLetter );
        holder.headerLayout.setVisibility(View.VISIBLE);
    }else{
        holder.headerLayout.setVisibility(View.GONE);
    }

C'est la méthode la plus simple pour afficher l'en-tête de section dans la vue Liste Android, mais cela ne fonctionnera pas comme l'en-tête de section Iphone, c'est-à-dire. L'en-tête de la section est masqué avec les autres éléments de la liste lorsque nous faisons défiler vers le haut ou le bas.

12
Jashan PJ

J'ai trouvé quelques exemples dans Android pouvant résoudre ce problème: Veuillez trouver l'exemple concernant PinnedHeaderListView Exemple de PinnedHeaderListView

3
Phuong

Si quelqu'un a besoin d'une solution différente, en particulier de ceux qui sont plus habitués au développement iOS, préférez-la ou souhaitez imiter l'apparence iOS. Je recommande ce qui suit:

http://applidium.com/en/news/headerlistview_for_Android/

La logique est la même que pour iOS et fait le gros du travail pour vous

3
luke-009

Vous pouvez consulter SectionedMergeAdapter . Si vous avez plusieurs sous-listes de données, vous pouvez les assembler et avoir des en-têtes pour elles.

Exemple de code - 

ListView listView = (ListView) findViewById(Android.R.id.list);

ArrayAdapter<Integer> adapter1 =
        new ArrayAdapter<>(this, R.layout.item_list, Android.R.id.text1, arrayList1);
ArrayAdapter<Integer> adapter2 =
        new ArrayAdapter<>(this, R.layout.item_list, Android.R.id.text1, arrayList2);
ArrayAdapter<Integer> adapter3 =
        new ArrayAdapter<>(this, R.layout.item_list, Android.R.id.text1, arrayList3);

TextView tv1 = new TextView(this);
tv1.setText("Header 1");
TextView tv2 = new TextView(this);
tv2.setText("Header 2");
TextView tv3 = new TextView(this);
tv3.setText("Header 3");

SectionedMergeAdapter adapter = new SectionedMergeAdapter();

adapter.addSection(new SectionedMergeAdapter.Section(tv1, adapter1));
adapter.addSection(new SectionedMergeAdapter.Section(tv2, adapter2));
adapter.addSection(new SectionedMergeAdapter.Section(tv3, adapter3));

listView.setAdapter(adapter);
0
jaibatrik