L'en-tête ListView ignore layout_height

Je gonfle cette vue et ajoute-la à mon ListView comme un en-tête. J'essaie de le faire 500dp haut (codé dur, dans l'intérêt de cet exemple)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:background="@drawable/repeat_background" android:layout_height="500dp"> <ImageView android:id="@+id/filter_menu" android:src="@drawable/ic_sort" android:layout_gravity="center_vertical" android:padding="8dp" android:layout_weight="0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="showPopup"/> </LinearLayout> 

ListView ne respecte pas l'autorite de son en-tête et l'enveloppe sur son contenu. Quelqu'un peut-il expliquer ce qui se passe?

  • Qu'arrive-t-il à une base de données Sqlite lorsque l'application est supprimée?
  • Inverser l'animation morphing de la flèche à la case à cocher
  • Le navigateur Android étend l'image
  • Comment créer un lecteur vidéo en streaming pour un contenu important?
  • Android Market, Résultats de la recherche position Mystery
  • Comment lire / écrire un boolean lors de la mise en œuvre de l'interface Parcelable?
  • Disposition de glisser-déplacer dans Android 2.2
  • Comment obtenir l'identifiant unique de l'utilisateur One Signal dans Mobile?
  • Android java.net.SocketException: socket failed: EACCES (permission refusée)
  • Comment puis-je activer ou désactiver le GPS par programme sur Android?
  • Imposser un timeout dans BluetoothSocket inputtream.read () dans Android
  • Robotium. Dans la série de tests, chaque test suivant est affecté par le test précédent
  • One Solution collect form web for “L'en-tête ListView ignore layout_height”

    La clé pour comprendre ce qui se passe est de déterminer comment les en-têtes et les pieds de page ListView sont implémentés. Ils sont un tour: le moment où vous ajoutez le premier en-tête ou pied de page à votre ListView, votre ListAdapter est enveloppé dans un HeaderViewListAdapter (se produit à la ligne 270 de ListView.java ). Le HeaderListViewAdapter est un adaptateur de liste qui compose les valeurs et les valeurs de position pour inclure les en-têtes et les pieds de page; Les en-têtes et les pieds de page deviennent des éléments de liste normaux que le système gère pour vous.

    Si vous regardez la ligne 207 de HeaderListViewAdapter.java , vous verrez que l'implémentation getView ignore la vue parent lors de l'ajout d'un en-tête ou d'un pied de page. Cela a pour effet que son mLayoutParams ne soit pas initialisé à partir de XML (ne peut pas vraiment vous indiquer le code source, juste ce que j'ai découvert au fil du temps).

    Si vous suivez les appels à getView pour un peu, passez la ligne 2237 d'AbsListView.java et suivez les appels pour obtainView un peu et recherchez LayoutParams (c'est ce que je viens de faire) que vous vous retrouvez dans la ligne 1182 de ListView. Java . Ici, vous voyez que, si les paramètres de mise en page sont null lorsque la vue enfant est mesurée, elle demande à generateDefaultLayoutParams() , qui est implémenté à la ligne 6065 de AbsListView.java :

     @Override protected ViewGroup.LayoutParams generateDefaultLayoutParams() { return new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0); } 

    … et c'est là que votre WRAP_CONTENT vient.

    Comme un travail facile, enveloppez simplement le <LinearLayout/> de votre XML dans un <FrameLayout/> . Gardez le 500dp sur LinearLayout et faites que FrameLayout ait une hauteur de mise en page de WRAP_CONTENT (qui sera ignoré de toute façon).

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.