• Home
  • Youzik
  • Papystreaming
  • Darknet
  • Libertyland
  • Cacaoweb
  • GG maps
  • Yggtorrent
  • Zone téléchargement

Grimag

  • Accueil
  • Catégories
    • Smartphone
    • High Tech
    • Business
    • Web
    • Appli Jeux Vidéo
    • Shopping
  • Android c’est quoi ?
  • Nous Contacter
  • Nos comparatifs
    • Drone avec caméra
    • Clavier d’ordinateur
    • Onduleur
    • GPS
    • Répéteur WiFi

Intercaler des entêtes dans une listview



Dans ce tuto je vais réaliser une listview avec des entêtes intercalées pour créer des catégories . L’affichage que je veux obtenir

listviewcomplex

La Technique que je vais utilisée ici c’est de créer ma propre class ListSeparer qui est une extension de la class BaseAdapter qui elle pourra contenir d’autre adapter .

Je créer deux attributs sections et headers, section tableau de string et header tableau de string et adapter.

Je reprogramme certaine méthode exemple getItem celle qui donne la position dans ma listview par rapport au sections ajoutées

D’abord mes fichiers xml.

Le fichier list_header.xml pour afficher les entetes


     
   

Le fichier list_item.xml pour des items simples

 
   
 

Le fichier list_complex.xml pour des items avec titres et sous titres


    
   
        
    
  

Ma class ListSeparer.

public class ListSeparer extends BaseAdapter {
    
	
	public final Map sections = new LinkedHashMap();  
        public final ArrayAdapter headers;  
       public final static int TYPE_SECTION_HEADER = 0;  
	
	public ListSeparer(Context context) {
               //pour les entetes j'utilise le fichier list_header.xml
		headers = new ArrayAdapter(context, R.layout.list_header); 
	}
	//méthode pour ajouter dans le header le nom de ma catégorie et dans sections le nom et un objet adapter
	 public void addSection(String section, Adapter adapter) {  
		 this.headers.add(section);  
		 this.sections.put(section, adapter);  
      }  
	 //Renvoi la position d'un clique
	  public Object getItem(int position) {  
		        for(Object section : this.sections.keySet()) {  
		            Adapter adapter = sections.get(section);  
		           int size = adapter.getCount() + 1;  
		  
		          // récupération de la position dans la section 
		            if(position == 0) return section;  
		            if(position < size) return adapter.getItem(position - 1);  
		  
		           // passe à la section suivant  
		            position -= size;  
	        }  
		         return null;  
	    }
	  // renvoi le nombre d'item
	   public int getCount() {  
           // 	total de l'ensemble des sections, plus une pour chaque tête de section
           int total = 0;  
           for(Adapter adapter : this.sections.values())  
               total += adapter.getCount() + 1;  
           return total;  
       }  
		     
       public int getViewTypeCount() {  
            int total = 1;  
           for(Adapter adapter : this.sections.values())  
               total += adapter.getViewTypeCount();  
           return total;  
       }  
       
        public int getItemViewType(int position) {  
            int type = 1;  
            for(Object section : this.sections.keySet()) {  
                Adapter adapter = sections.get(section);  
                int size = adapter.getCount() + 1;  
      
                // Récupération de la position dans la section
                if(position == 0) return TYPE_SECTION_HEADER;  
                if(position < size) return type + adapter.getItemViewType(position - 1);  
      
                // passe a la section suivante moins un par l'entête 
                position -= size;  
                type += adapter.getViewTypeCount();  
            }  
            return -1;  
        }  
    	      
        public boolean areAllItemsSelectable() {  
            return false;  
        }  
      
        public boolean isEnabled(int position) {  
            return (getItemViewType(position) != TYPE_SECTION_HEADER);  
        } 
     
       
         
        public View getView(int position, View convertView, ViewGroup parent) {  
            int sectionnum = 0;  
            for(Object section : this.sections.keySet()) {  
                Adapter adapter = sections.get(section);  
                int size = adapter.getCount() + 1;  
      
                // Récupération de la position dans la section  
                if(position == 0) return headers.getView(sectionnum, convertView, parent);  
                if(position < size) return adapter.getView(position - 1, convertView, parent);  
      
                // otherwise jump into next section  
                position -= size;  
                sectionnum++;  
            }  
            return null;  
        }  
          
         
        public long getItemId(int position) {  
            return position;  
        }  
}

Exemple d'utilisation de ma classe dans une application.

public class ListeCourse extends Activity{
	public final static String ITEM_TITLE = "title";  
	public final static String ITEM_CAPTION = "caption";
	LecteurFlux objLectFlux = new LecteurFlux();
	  public Map createItem(String title, String caption) {  
		         Map item = new HashMap();  
		         item.put(ITEM_TITLE, title);  
		         item.put(ITEM_CAPTION, caption);  
		         return item;  
		     } 
	  
	   @Override 
         public void onCreate(Bundle icicle) {  
	           super.onCreate(icicle); 

                 
                  List> security = new LinkedList>();  
	           security.add(createItem("titre 1 ", "sous titre du titre1"));  
	           security.add(createItem("titre 2", "Sous titre du titre 2"));  
	           security.add(createItem("Titre 3", "sous titre du titre 3 un peu lon pour avoir un retour à la ligne"));  
	     
	           // creation de nom objet de type ListSeparer 
	           ListSeparer adapter = new ListSeparer(this);  

                   // ajoute d'un objet adapter nom de la catégorie Array Test avec deux items first item et item two
	           adapter.addSection("Array test", new ArrayAdapter(this, R.layout.list_item, new String[] { "First item", "item two" }));  

                   //ajout d'un autre adapter avec entete plux complex et des items sur deux lignes
	           adapter.addSection("Plus complex", new SimpleAdapter(this, security, R.layout.list_complex,  
	               new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] { R.id.list_complex_title, R.id.list_complex_caption }));  
	     
	     
	          
            ListSeparer adapter = objLectFlux.liste_course_periode(this);
	    ListView list = new ListView(this);  
	    list.setAdapter(adapter);  
	    this.setContentView(list); 

        }

}

Il est temps de mettre à profit les tutoriels d'Android France:
Passez à la vitesse supérieure et investissez quelques dizaines d'euros pour acquérir les connaissances qui vous feront gagner de l'argent avec vos applications rendez-vous sur notre boutique Android-france pour ces formations en vidéo

Suite à vos mails j'ai créé deux nouvelles catégories pour accéder directement aux tuto.

  • Developpez sous Android pour tous les tuto sur les étapes du développement du logiciel de gestion de recette
  • Tuto développement les autres tuto de développement sur des thèmes précis
Juil 27, 2009Gnakouri Danon


L'application du magazine cinéma PREMIERE pour AndroidDes photos du Philips V808 un possible smartphone Philips sous Android
Gnakouri Danon

Co-fondateur du site Android france, senior lead developper, passionné de bière et de cigare cubain

27 juillet 2009 Developpement, Tuto développementlistview568

2023 © Android-France