(Android) Comment remplir l'arrière-plan ListView et préserver la transparence d'en-tête

J'ai un fond d'image personnalisé qui remplit l'écran entier derrière un ListView.

ListView a un en-tête qui contient des données, puis une marge transparente de 10dp (nous permettant de voir un peu l'image d'arrière-plan), puis d'autres données. Au-dessous de cet en-tête, dans le "corps" de ListView, je dois faire en sorte que l'arrière-plan de l'apparence de ListView se termine complètement en bas de l'écran, même si les éléments qui entrent ne descendent pas complètement en bas.

  • Quelle est la signification exacte de «évier de cuisine» dans la programmation?
  • Le serveur ADB n'a pas reconnu
  • Erreurs de Gradle dans Android Studio
  • Le sélecteur de couleur Android ne fonctionne pas avec des attributs personnalisés
  • Comment montrer le marqueur dans Maps lancé par geo uri Intent?
  • Capture de stdout / stderr avec NDK
  • Si je définis l'arrière-plan de ListView, je reçois l'effet souhaité de toujours remplir au bas de l'écran, même avec seulement quelques éléments (ou pas du tout). Mais cela couvre également le diviseur transparent 10dp dans l'en-tête, de sorte que je ne peux plus voir l'arrière-plan personnalisé «à travers» l'en-tête.

    Quelqu'un peut-il me pointer sur le bon chemin pour obtenir à la fois le remplissage de l'écran tout en maintenant le diviseur transparent dans l'en-tête?

    Quelqu'un a mentionné en passant que je pourrais avoir besoin de créer des cellules d'objets "fausses" qui pourraient être utilisées pour créer l'illusion d'un fond d'écran ListView sans affecter le diviseur transparent de l'en-tête. Cependant, j'espère trouver une solution plus simple si possible … ou si c'est la meilleure solution, voir si quelqu'un peut me donner des indications sur la façon de l'accomplir de la manière la plus efficace.

    Je vous remercie!

    MODIFIER:

    Voici comment je définis l'en-tête, bien que je pense que cette question a plus à voir avec ListView que cet en-tête que j'ajoute à ListView via addHeaderView ().

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical"> <include android:id="@+view_list_header/headertop" layout="@layout/view_list_item"/> **<LinearLayout android:id="@+view_list_header/ll_transparent_filler" android:layout_width="fill_parent" android:layout_height="10dp"/>** <RelativeLayout android:id="@+view_list_header/sort" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView.../> <ImageView.../> <TextView.../> </RelativeLayout> </RelativeLayout> 

    Donc, j'ai essayé différentes façons de créer le remplissage 10dp, actuellement j'utilise un LinearLayout "vide" de 10dp pour pouvoir obtenir une référence et définir sa visibilité à GONE quand je le veux (ce que je ne fais PAS Dans le cas où je discuterai)

    Je définis l'arrière-plan de ListView comme ceci: listView.setBackgroundResource (resource).

    Encore une fois, lorsque je définis l'arrière-plan de ce ListView, j'obtiens le comportement souhaité de l'arrière-plan en remplissant toujours l'écran entier, même si le nombre d'éléments que j'ai ajouté à la liste (qui, d'autre part, utilise la même ressource d'arrière-plan que je suis La configuration de ListView) ne suffit pas pour remplir l'écran. Mais lorsque je le fais, la "marge transparente" de 10dp dans l'en-tête n'est pas visible parce que, derrière elle, l'arrière-plan ListViews empêche les vues sous-jacentes d'être vues.

    Je suppose que cela se produit parce que l'arrière-plan de ListView passe également derrière les vues en en-tête et en pied de page.

    Le fait est qu'il existe de nombreuses façons de créer une «marge transparente» de 10 pouces entre les éléments qui permettront d'afficher les vues sous-jacentes. Mon problème réside dans la création d'un arrière-plan pour le "corps" ListView (c'est-à-dire pas l'en-tête / pied de page) qui remplit toujours l'écran, même si la liste est partiellement remplie ou vide et en même temps préservant cette transparence dans l'en-tête de sorte que je Peut encore voir les vues qui sont "derrière" le ListView.

  • La console Eclipse montre: 'Impossible de pousser la sélection: système de fichiers en lecture seule' lorsque j'essaie de pousser un fichier
  • Android: affichage du texte au centre de la barre de progression
  • Animer les éléments desséchables à deux couches Pre-Honeycomb
  • Pourquoi utiliser strings.xml dans Android?
  • Android lance des paramètres système à la place de mon application
  • Ouvrez une boîte de dialogue en cliquant sur un bouton présent dans la notification dans Android
  • 3 Solutions collect form web for “(Android) Comment remplir l'arrière-plan ListView et préserver la transparence d'en-tête”

    Vous devez créer les éléments dans ListView transparent en suivant le ListView :

     android:background="@android:color/transparent" android:cacheColorHint="@android:color/transparent" 

    Ensuite, votre disposition des articles doit avoir n'importe quelle couleur / image (ceci sera mis au dessus de la transparence).

    Cela devrait fonctionner, mais ce sera un travail lourd sur Android, car la transparence prend vraiment son péage sur Android, surtout lorsqu'il s'agit d'un ListView où il y a beaucoup de mises à jour UI.

    Je l'ai piraté en ajoutant un pied de page coloré. Le pied de page était un LinearLayout contenant une vue appelée "fill" définie à 5dp hauteur w / la couleur bg souhaitée.

    Après avoir rempli et mise à l'échelle mon en-tête de liste (code précédent), j'ai ensuite ajusté le pied de page pour remplir l'espace d'écran restant:

      ... int totHeight = getTotalHeightofListView(); if((mHeader.getMeasuredHeight() + totHeight) < mList.getMeasuredHeight()) addFooterFill(mHeader.getMeasuredHeight() + totHeight); } protected int getTotalHeightofListView() { ListAdapter LvAdapter = mList.getAdapter(); int totHeight = 0; for (int i = 0; i < mAdapter.getCount(); i++) { View mView = mAdapter.getView(i, null, mList); mView.measure( MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); totHeight += mView.getMeasuredHeight(); } return totHeight; } protected void addFooterFill(int sizeUsed){ View fill = (View) mFooter.findViewById(R.id.fill); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) fill.getLayoutParams(); params.height = mList.getMeasuredHeight() - sizeUsed; fill.setLayoutParams(params); } 

    En théorie, cela devrait fonctionner même si vous avez déjà un pied de page. Vous êtes essentiellement en train d'ajuster la hauteur d'une vue dans le pied de page.

    J'ai trouvé une solution à cela, si quelqu'un en a encore besoin. Je viens de faire des dessins qui ont le dessus en couleur comme fond d'en-tête comme ceci:

     <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:right="-45dp" android:left="-45dp" android:bottom="-45dp"> <shape> <solid android:color="@color/gray_back" /> <stroke android:width="40dp" android:color="@color/colorPrimaryDark" /> </shape> </item> 

    Je sais qu'il est possible d'utiliser NavigationView maintenant, mais j'ai besoin d'une solution rapide pour l'application en cours.

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