ListView d'arrière-plan devient noir lors du défilement


427

J'ai créé une liste spécifique qui existe à partir des éléments suivants pour créer une liste déroulante avec chaque ligne contenant une image sur le côté gauche et du texte sur le côté droit:

Pour commencer avec une disposition "racine":

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:background="#C8C8C8"
    >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false"
        android:divider="#C8C8C8"
        android:background="#C8C8C8"/>
</LinearLayout>

puis dans le ListView, je place l'élément "ligne" suivant:

<?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"
    android:orientation="horizontal"
    android:background="@drawable/bg_row"
>
    <ImageView
        android:layout_width="wrap_content"
        android:paddingLeft="10px"
        android:paddingRight="15px"
        android:paddingTop="5px"
        android:paddingBottom="5px"
        android:layout_height="wrap_content"
        android:src="@drawable/bg_image"
    />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="5px"
        android:paddingBottom="5px"
        android:textSize="16sp"
        android:textColor="#000000"
        android:layout_gravity="center"
        android:maxHeight="50px"/>
</LinearLayout>

Tant que l'écran est affiché statiquement (comme dans aucun mouvement), il s'affichera correctement, mais lorsque je commence à faire défiler la liste, l'arrière-plan de l'élément de ligne (une "icône" comme peut être affiché dans le code) sera affiché correctement mais l'arrière-plan de la disposition "racine" deviendra complètement noir ... lorsque le défilement s'arrête, l'arrière-plan reprendra la plupart du temps sa couleur ... Pendant le test, j'ai également ajouté un TextViewélément dans cet élément racine avec le même arrière-plan, celui-ci conservera sa couleur lorsque la liste défile ... Une idée pourquoi cela se produit, et comment résoudre cela?

Réponses:


771

Ajouter un attribut sur le ListViewtag

android:cacheColorHint="#00000000" // setting transparent color

Pour plus de détails, consultez ce blog


23
this.getListView (). setCacheColorHint (0); De la mise en page, je ne pouvais pas définir la couleur. Mais j'ai réussi à le faire avec le code ci-dessus. J'ai utilisé ce code dans «onCreate» de l'activité de liste. J'espère que ces informations vous aideront également.
Dijo David

70
android:cacheColorHint="#0000"fonctionne également si vous avez peur des zéros.
Andrew

136
Ou aussi android:cacheColorHint="@android:color/transparent"si vous avez peur des chiffres :)
dule

2
@android: color / transparent a probablement l'avantage supplémentaire d'avoir un seul bit. Il y a un bug où si vous passez 0 sur certains téléphones, la transparence ne fonctionnera pas. L'astuce consiste donc à définir 1 bit.
Thomas Dignan

63

C'est très simple, utilisez simplement cette ligne dans votre fichier de mise en page:

android:scrollingCache="false"

comme ça:

<ListView 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollingCache="false"
/>

2
Cela fonctionne mais je ne pense pas que ce soit intelligent: stackoverflow.com/questions/15570041/scrollingcache
Morten Holmgaard

1
J'ai eu un cas dans lequel android: cacheColorHint = "# 00000000" ne fonctionnait pas, mais android: scrollingCache = "false". Merci.
Yar

27

vous pouvez utiliser comme ceci:

list.setCacheColorHint(Color.TRANSPARENT);
list.requestFocus(0);

10

android:id="@android:id/list"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
android:divider="#C8C8C8"
android:background="#C8C8C8"
android:cacheColorHint="#00000000"/>

7

Nous avons beaucoup d'options pour ce problème, vous pouvez définir l'arrière-plan comme transparent via une programmation comme

yourlistview.setCacheColorHint(Color.TRANSPARENT); 

ou via xml

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

5

Dans votre xml où utiliser Listviewset

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

5

J'utilise des images listViewet ça devient noir parfois sur samsung s4 même pas de défilement. C'était une erreur stupide que j'ai faite dans l'adaptateur. Je viens de mettre ma vue à zéro pour résoudre ce problème

 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder;
            convertView = null; // convert view should be null
            if (convertView == null) {
                holder = new Holder();
                convertView = inflater1.inflate(R.layout.listview_draftreport_item, null);
             } 
        }

4

Il y a beaucoup de réponses à cette question, mais aujourd'hui, j'ai réalisé que cette question manquait toujours d'une information essentielle.

Il existe deux solutions possibles au problème, les deux fonctionnent mais chacune doit être utilisée dans des situations différentes.


Les méthodes

À utiliser android:cacheColorHintlorsque vous avez ListViewun arrière-plan de couleur unie .

<item name="android:cacheColorHint">@android:color/transparent</item>

À utiliser android:scrollingCachelorsque vous avez ListViewune image (complexe) en arrière-plan.

<item name="android:scrollingCache">false</item>

Remarque

Lorsque votre ListViewa un arrière-plan de couleur unie, les deux méthodes fonctionneront, donc non seulement cacheColorHintelles fonctionneront. Mais il n'est pas recommandé d'utiliser lescrolingCache méthode pour les arrière-plans de couleur unie car elle désactive une méthode d'optimisation utilisée pour une animation et un défilement fluides de ListView.

Remarque: scrolingCache la valeur false ne signifie pas nécessairement que les ListViewanimations de et le défilement deviendront lents.



2

Ce qui suit a fonctionné pour moi:

myListView.setScrollingCacheEnabled(false);

1

android:cacheColorHint="#00000000"// setting transparent color

ou

ne définissez pas l' arrière-plan de listview.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.