Background ListView se vuelve negro al desplazarse

427

He creado una lista específica que existe a partir de los siguientes elementos para crear una lista desplazable con cada fila que contiene una imagen en el lado izquierdo y algo de texto en el lado derecho:

Para comenzar con un diseño "raíz":

<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>

y luego dentro de ListView coloco el siguiente elemento de "fila":

<?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>

Mientras la pantalla se muestre estáticamente (como sin movimiento), se mostrará correctamente, pero cuando empiece a desplazarme por la lista, se mostrará el fondo del elemento de fila (un "icono" como se puede mostrar en el código) se muestra correctamente pero el fondo del diseño "raíz" se volverá completamente negro ... cuando el desplazamiento se detenga, el fondo, la mayoría de las veces, recuperará su color ... Como pruebo, también agregué un TextViewelemento raíz con el mismo fondo, este detendrá su color cuando se desplaza la Lista ... ¿Alguna idea de por qué sucede esto y cómo resolverlo?

Tigre
fuente

Respuestas:

771

Agregar un atributo en la ListViewetiqueta

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

Para más detalles consulte este blog

Praveen
fuente
23
this.getListView (). setCacheColorHint (0); Desde el diseño no pude establecer el color. Pero logré hacerlo con el código anterior. He usado este código en 'onCreate' de la actividad de la lista. Espero que esta información también ayude.
Dijo David
70
android:cacheColorHint="#0000"También funciona si tienes miedo a los ceros.
Andrew
136
O también android:cacheColorHint="@android:color/transparent"si tienes miedo a los números :)
dule
2
@android: color / transparent probablemente tiene la ventaja adicional de tener un solo bit establecido. Hay un error en el que si pasa 0 en algunos teléfonos, la transparencia no funcionará. Entonces el truco es establecer 1 bit.
Thomas Dignan
63

Es muy simple, solo use esta línea en su archivo de diseño:

android:scrollingCache="false"

Me gusta esto:

<ListView 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollingCache="false"
/>
Mahesh
fuente
2
Funciona pero no creo que sea inteligente: stackoverflow.com/questions/15570041/scrollingcache
Morten Holmgaard
1
Tuve un caso en el que android: cacheColorHint = "# 00000000" no funcionó, pero android: scrollingCache = "false" sí. Gracias.
Yar
27

puedes usar así:

list.setCacheColorHint(Color.TRANSPARENT);
list.requestFocus(0);
nikki
fuente
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
fuente
7

Tenemos muchas opciones para este problema, puede establecer el fondo como transparente a través de la programación como

yourlistview.setCacheColorHint(Color.TRANSPARENT); 

o a través de xml

android:cacheColorHint="@android:color/transparent"
Sampath Kumar
fuente
5

En tu xml donde usar Listviewset

    android:cacheColorHint="@android:color/transparent"
jeet parmar
fuente
5

Estoy usando imágenes listViewy a veces se vuelve negro en Samsung s4 sin siquiera desplazarse. Fue un error estúpido lo que hice en el adaptador. Simplemente puse mi punto de vista en nulo para solucionar este problema

 @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
fuente
4

Hay muchas respuestas a esta pregunta, pero hoy me di cuenta de que a esta pregunta todavía le falta una información crítica.

Hay dos posibles soluciones para el problema, ambas funcionan pero cada una debe usarse en diferentes situaciones.


Métodos

Úselo android:cacheColorHintcuando ListViewtenga un fondo de color sólido .

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

Utilizar android:scrollingCachecuando su ListViewtiene un (complejo) la imagen como fondo.

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

Nota

Cuando ListViewtiene un fondo de color sólido, ambos métodos funcionarán, por lo que no solo cacheColorHintfuncionará. Pero no se recomienda utilizar el scrolingCachemétodo para fondos de color sólido, ya que desactiva un método de optimización utilizado para animar y desplazar suavemente ListView.

Nota para la nota: scrolingCache establecer en falso no significa necesariamente que las ListViewanimaciones y el desplazamiento de la cámara se ralentizarán.

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

Lo siguiente funcionó para mí:

myListView.setScrollingCacheEnabled(false);
Ninja perezoso
fuente
1

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

o

no establezca el fondo de listview.

Akshay Paliwal
fuente