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?

Respostas:


771

Adicionar um atributo na ListViewtag

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

Para mais detalhes consulte este blog


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

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

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

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"

5

No seu xml onde usar Listviewset

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

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);
             } 
        }

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.



2

O seguinte funcionou para mim:

myListView.setScrollingCacheEnabled(false);

1

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

ou

não defina fundo de listview.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.