O Background ListView fica preto ao rolar

427

Eu criei uma lista específica que existe entre os seguintes elementos para criar uma lista rolável com todas as linhas que contêm uma imagem no lado esquerdo e algum texto no lado direito:

Para começar com um layout "raiz":

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

e, no ListView, coloco o seguinte item "linha":

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

Enquanto a tela for mostrada estaticamente (como em nenhum movimento), ela será exibida corretamente, mas quando eu começar a rolar pela lista, o plano de fundo do item de linha (um "ícone", como pode ser mostrado no código) será exibido. mostrado corretamente, mas o plano de fundo do layout "raiz" ficará completamente preto ... quando a rolagem parar, o fundo receberá na maioria das vezes sua cor ... Enquanto eu testei, também adicionei um TextViewelemento raiz com o mesmo plano de fundo, este detém sua cor quando a lista é rolada ... Alguma idéia de por que isso está acontecendo e como resolver isso?

Tigre
fonte

Respostas:

771

Adicionar um atributo na ListViewtag

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

Para mais detalhes consulte este blog

Praveen
fonte
23
this.getListView (). setCacheColorHint (0); No layout, não consegui definir a cor. Mas eu consegui fazer isso com o código acima. Eu usei esse código em 'onCreate' da atividade da lista. Espero que esta informação também ajude.
Dijo David
70
android:cacheColorHint="#0000"também funciona se você tiver medo de zeros.
Andrew
136
Ou também, android:cacheColorHint="@android:color/transparent"se você tem medo de números :) #
684
2
@android: color / transparent provavelmente tem o bônus adicional de ter um único bit definido. Há um erro no qual, se você passar 0 em alguns telefones, a transparência não funcionará. Portanto, o truque é definir 1 bit.
Thomas Dignan
63

É muito simples, basta usar esta linha no seu arquivo de layout:

android:scrollingCache="false"

como isso:

<ListView 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollingCache="false"
/>
Mahesh
fonte
2
Ele funciona, mas eu não acho que é inteligente para fazer: stackoverflow.com/questions/15570041/scrollingcache
Morten Holmgaard
1
Eu tive um caso em que android: cacheColorHint = "# 00000000" não funcionava, mas android: scrollingCache = "false" funcionava. Obrigado.
Yar
27

você pode usar assim:

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

Temos muitas opções para esse problema. Você pode definir o plano de fundo como transparente por meio de programação como

yourlistview.setCacheColorHint(Color.TRANSPARENT); 

ou através de xml

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

No seu xml onde usar Listviewset

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

Estou usando imagens listViewe, às vezes, fica preto no samsung s4 nem mesmo rolando. Foi um erro estúpido que cometi no adaptador. Acabei de colocar meu modo de exibição nulo para corrigir esse 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
fonte
4

Há muitas respostas para essa pergunta, mas hoje percebi que essa pergunta ainda está faltando uma informação crítica.

Existem duas soluções possíveis para o problema, ambas funcionam, mas cada uma deve ser usada em situações diferentes.


Métodos

Use android:cacheColorHintquando ListViewtiver um fundo de cor sólida .

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

Use android:scrollingCachequando o seu ListViewtem um (complexo) imagem como pano de fundo.

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

Nota

Quando o seu ListViewtem um fundo de cor sólida, ambos os métodos funcionam, portanto, não apenas o cacheColorHintfunciona. Mas não é recomendável usar o scrolingCachemétodo para fundos de cores sólidas, pois desativa um método de otimização usado para animar e rolar suavemente o ListView.

Nota para a nota: scrolingCache defina como false não significa necessariamente que as ListViewanimações e a rolagem se tornarão lentas.

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

O seguinte funcionou para mim:

myListView.setScrollingCacheEnabled(false);
Lazy Ninja
fonte
1

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

ou

não defina fundo de listview.

Akshay Paliwal
fonte