2011-10-24 5 views
36

J'ai un ListView avec un tas d'éléments à l'intérieur. Comment est-ce que je fais les articles supérieurs et inférieurs ont une marge supérieure de 10dp pour l'article supérieur et la marge inférieure de 10dp pour l'article inférieur? Maintenant, je peux le faire avec padding ou marge sur le ListView mais le résultat est que lorsque vous faites défiler le bord de la ListView est maintenant 10dp à partir du bas de l'écran. En tout cas autour de ça? J'ai également essayé de définir des marges à l'intérieur de la méthode getView de ma carte mais je ne vois aucune option de marge pour AbsListView.LayoutParams. Toute aide est la bienvenue.Android ListView rembourrage pour le contenu sans déplacer la hauteur ListView?

Merci

+1

suggestion Nasty, mais que diriez-vous d'un rembourrage en haut/bas pour la première/dernière vue article? Vous devez vérifier et définir sur toutes les vues dans 'getView' ... – Knickedi

Répondre

121

L'astuce est d'inclure android:clipToPadding="false" dans votre définition de la vue, .: par exemple

<ListView android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="16dip" 
    android:paddingBottom="16dip" 
    android:clipToPadding="false" /> 
+1

C'était exactement ce que je cherchais et c'était une solution simple. Cela a fonctionné très bien et je construis contre Android 2.1-update1. – Bobbake4

+1

Pourquoi seulement dans Android 3.0+? Selon la référence Android cette fonctionnalité a été là depuis le tout début (API Niveau 1): http://developer.android.com/reference/android/view/ViewGroup.html#setClipToPadding(boolean) – jenzz

+0

lol passé 45 minutes en essayant pour que cela fonctionne avec toutes sortes de rembourrage et de configuration de marge. Même venu à travers clipToPadding, mais mal compris et mis à vrai :) Merci –

5

Pourquoi ne pas simplement vérifier la position de l'élément par rapport à la taille de votre liste:

Rembourrage:

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     //recycle views and whatever else you normally would do goes here.. 
     //... 
     //... 

     if (position == 0){ 
      convertView.setPadding(0, 10, 0, 0); //padding on top for top item 
     } 
     else if (position == getCount() - 1){ 
      convertView.setPadding(0, 0, 0, 10); //padding on bottom for bottom item 
     } 
     else{ 
      convertView.setPadding(0, 0, 0, 0); //no padding 
     } 
} 

Pour marges utilisation

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
lp.setMargins(left, top, right, bottom); 
convertView.setLayoutParams(lp); 

Ex :

public View getView(int position, View convertView, ViewGroup parent) 
    { 
      //recycle views and whatever else you normally would do goes here.. 
      //... 
      //... 
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,  LinearLayout.LayoutParams.WRAP_CONTENT); 
      if (position == 0){ 
       lp.setMargins(0, 10, 0, 0); //margin on top for top item 
      } 
      else if (position == getCount() - 1){ 
       lp.setMargins(0, 10, 0, 10); //margin on bottom for bottom item 
      } 
      else{ 
       lp.setMargins(0, 0, 0, 0); //no margin 
      } 
      convertView.setLayoutParams(lp); 
    } 

à condition que vous ayez implémenté correctement la méthode getCount() pour votre carte.

+0

Ceci est une excellente solution. L'utilisation de l'en-tête de type G + (qui augmente lors du défilement vers le haut et le bas) rend impossible l'affichage d'une vue d'ensemble et l'ajout de paddings à la liste elle-même. –

11

Vous pouvez obtenir de l'espace en haut et en bas de votre ListView, à l'intérieur de la zone de défilement, en utilisant des en-têtes et des pieds de page. Voici un exemple rapide:

Définir votre point de vue de remplissage, que j'ai appelé header_footer.xml:

<?xml version="1.0" encoding="utf-8"?> 
<View xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="10dp"/> 

Maintenant, votre méthode onCreate ressemble à ceci, en supposant nommé votre ListView listView:

final LayoutInflater inflater = 
     (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View headerFooter = inflater.inflate(R.layout.header_footer, null); 
    listView.addFooterView(headerFooter); 
    listView.addHeaderView(headerFooter); 

Et puis définissez votre adaptateur.

+1

Fonctionne très bien, je crois en toute version Android, alors que l'utilisation de clipToPadding (solution ci-dessus) ne fonctionne que sur certaines versions androd – Don

+0

Réponse utile, merci! Je l'ai édité juste pour enlever la complexité inutile. Un simple 'View' fera l'affaire - il n'y a pas besoin de' LinearLayout' dans un autre 'LinearLayout'. –

Questions connexes