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?

Tigre
la source

Réponses:

771

Ajouter un attribut sur le ListViewtag

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

Pour plus de détails, consultez ce blog

Praveen
la source
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"
/>
Mahesh
la source
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);
nikki
la source
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"/>
AnDx
la source
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"
Sampath Kumar
la source
5

Dans votre xml où utiliser Listviewset

    android:cacheColorHint="@android:color/transparent"
jeet parmar
la source
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);
             } 
        }
Ahmad Arslan
la source
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.

Rolf ツ
la source
2
android:cacheColorHint="@android:color/transparent"
muditagarwal88
la source
2

Ce qui suit a fonctionné pour moi:

myListView.setScrollingCacheEnabled(false);
Lazy Ninja
la source
1

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

ou

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

Akshay Paliwal
la source