34 votes

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

J'ai créé une application android avec une ListView. J'ai ajouté les deux un en-tête et pied de page de la liste. Mais lors de l'ajout d'un diviseur/séparateur il crée également un espace vide entre la tête et le premier élément de liste. Il fait de même pour le dernier élément de liste et le pied de page.

L'espace vide est équivalent à la taille de la ligne de séparation entre tous les éléments ListView, avec la différence qu'il ne dessine pas le diviseur et laisse tout l'espace vide. J'ai pensé que j'ai trouvé la solution avec les attributs xml "Footer diviseurs enabled" et "en-Tête de diviseurs activé'. Mais lorsque le paramètre sur false (faux), ça ne change rien. J'ai même essayé de les définir par programmation avec

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

Mais il ne fonctionne tout simplement pas. De toute façon pour résoudre ce problème? Je ne veux juste pas l'espace vide pour y être, je veux que le premier élément pour l'adapter exactement à l'en-tête (même pour le pied de page).

5voto

Je suis tombé sur le même problème, mais dans une situation légèrement différente de la vôtre. Mon ListView a un en-tête (une zone de recherche), mais le premier point ci-dessous il contient un en-tête de section (une date, ou une lettre) plutôt que d'être un élément de liste standard (avec le contenu réel sous la forme d'une image, d'un texte, et ainsi de suite). En tant que tel, je le veux de ne pas être sélectionnables, donc dans ma coutume adaptateur j'ai annulé areAllItemsEnabled de rendement false.

Grosse erreur, parce que c'est exactement le coupable. Voir, il semble que, de par sa conception, l' ListView mise en œuvre ne dessiner que les séparations entre les deux éléments activés, mais encore réserver de l'espace pour les séparations entre un élément activé et désactivé, même si ces diviseurs ne seront pas établis. Le fait que ce soit conscient décision de conception ne signifie pas qu'il n'est pas stupide, bien sûr. Le plus bizarre, c'est que les diviseurs de dessin politique est basé uniquement sur la valeur retournée par areAllItemsEnabled , au lieu de les valeurs renvoyées par de simples appels à l' isEnabled pour les autres éléments.

Ainsi, pour le contourner, j'ai juste eu à revenir true de areAllItemsEnabled (j'ai gardé la méthode de remplacement et d'ajouter un commentaire au sujet de ce problème, sinon je ne serais pas capable de vous en souvenir d'un mois à partir de maintenant): et voilà, espace blanc a disparu, remplacé par une cloison. Maintenant, si je veux montrer l' ListView - tête et le premier en-tête de section comme étant exactement adjacente, j'ai juste à choisir un diviseur de couleur qui est la même que la section en-tête de couleur.

Vraiment j'espère que c'est le même cas que le vôtre, ou que ma solution vous permet de vous d'une autre façon.

1voto

lucian Points 79

J'ai essayé ce type de solution 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>

lors de la création de vues:

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

si vous voulez la montrer, faire ceci:

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

si vous voulez le cacher, faire ceci:

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

il fonctionne parfaitement dans notre projet.espérons qu'il est utile.

0voto

Pramod Points 368

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.

0voto

nanithehaddock Points 48

Allez dans les propriétés ListView dans la disposition Android et recherchez une balise d'espacement ... comment, dans Android, lors de la création de nouvelles dispositions, la création par défaut sera l'espacement de l'en-tête et les propriétés de la bordure. vérifiez-le, s'il est disponible, supprimez-le

0voto

craigrs84 Points 397

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 de manière dynamique dans l'adaptateur si vous avez besoin d'un contrôle plus précis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X