web-dev-qa-db-fra.com

Espace vide entre l'en-tête listview et le premier élément

J'ai créé une application Android avec un ListView. J'ai ajouté un en-tête et un pied de page à la liste. Mais lors de l'ajout d'un séparateur/séparateur, un espace vide est créé entre l'en-tête et le premier élément ListView. Il en va de même pour le dernier élément ListView et le pied de page.

L'espace vide équivaut à la taille du séparateur entre tous les éléments ListView, à la différence qu'il ne dessine pas le séparateur et ne laisse que des espaces vides. Je pensais avoir trouvé la solution avec les attributs xml «Diviseur de pied de page activé» et «Diviseur d'en-tête activé». Mais si vous les définissez sur false, cela ne change rien. J'ai même essayé de les définir par programme avec 

list.setFooterDividerEnabled(false);
list.setHeaderDividerEnabled(false);

Mais ça ne marche pas. Un moyen de résoudre ce problème? Je ne veux tout simplement pas que l'espace vide soit là, je veux que le premier élément corresponde exactement à l'en-tête (idem pour le pied de page).

34
Niles11

Je suis tombé sur le même problème, mais dans une situation légèrement différente de la vôtre. Ma ListView a un en-tête (un champ de recherche), mais le premier élément situé en dessous contient un en-tête de section (une date ou une lettre) plutôt qu'un élément de liste normal (avec le contenu réel sous la forme d'une image, du texte, etc). En tant que tel, je souhaite qu'il ne soit pas sélectionnable. C'est pourquoi, dans mon adaptateur personnalisé, j'ai remplacé areAllItemsEnabled par return false.

Grosse erreur, car c'est exactement le coupable. Voir, il semble que, par conception, la ListView implementation trace uniquement des séparateurs entre deux éléments activés , tout en réservant un espace pour les séparateurs entre un élément activé et un élément désactivé, même si ces séparateurs ne seront pas dessinés. Le fait qu'il s'agisse d'une décision de conception consciente ne signifie pas que ce n'est pas stupide, bien sûr. Plus étrange encore, cette règle de dessin des séparateurs est basée uniquement sur la valeur renvoyée par areAllItemsEnabled au lieu des valeurs renvoyées par des appels uniques à isEnabled pour les éléments suivants.

Ainsi, pour contourner ce problème, je devais simplement renvoyer true de areAllItemsEnabled (j'ai conservé la méthode surchargée et ajouté un commentaire à propos de ce problème, sinon je ne pourrais pas m'en souvenir dans un mois): voilà, des espaces disparu, remplacé par un diviseur. Maintenant, si je veux afficher l'en-tête ListView et le premier en-tête de section comme étant exactement adjacents, il me suffit de choisir une couleur de séparateur identique à celle de l'en-tête de section.

Espérons vraiment que c'est le même cas que le vôtre, ou que ma solution vous aide d'une autre manière.

5
Giulio Piancastelli

J'ai essayé la solution de ce type et cela fonctionne (le code est basé sur pulltorefresh ):

la mise en page XML (header.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" >

    <RelativeLayout
        Android:id="@+id/content"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content" >

        <ProgressBar
            style="@Android:style/Widget.ProgressBar.Small.Inverse"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerInParent="true"
            Android:layout_margin="16dp"
            Android:layout_marginTop="2dp" />
    </RelativeLayout>
</LinearLayout>

quand créer des vues:

m_headerView = inflater.inflate(R.layout.header, this, false);

si vous voulez le montrer, faites ceci:

m_headerView.setPadding(0, 0, 0, 0);
m_headerView.setVisibility(View.VISIBLE);

si vous voulez le cacher, faites ceci:

m_headerView.setPadding(0, -1000, 0, 0);
m_headerView.setVisibility(View.GONE);

cela fonctionne parfaitement dans notre projet. J'espère que c'est utile.

1
lucian

allez dans les propriétés ListView dans la présentation Android et recherchez une balise d'espacement. Comme dans Android, lors de la création de nouvelles présentations, la création par défaut est l'espacement de l'en-tête et les propriétés de la bordure. vérifiez-le, s'il est disponible, supprimez-le

0
nanithehaddock

Dans la méthode getview, vous pouvez vérifier si l’élément est premier ou dernier et définir un dévider personnalisé qui sera 0 hauteur ou 1 pixel hauteur de couleur transparente.

0
Pramod

N'a pas trouvé une bonne solution.

Définissez dividerHeight="0dp" et créez manuellement mes propres diviseurs - soit directement dans le XML de présentation, soit dynamiquement dans l'adaptateur si vous avez besoin d'un contrôle plus précis.

0
craigrs84