Tło ListView staje się czarne podczas przewijania


427

Utworzyłem specjalną listę, która istnieje z następujących elementów, aby utworzyć przewijaną listę z każdym wierszem zawierającym obraz po lewej stronie i trochę tekstu po prawej stronie:

Aby rozpocząć od układu „root”:

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

a następnie w widoku listy umieszczam następujący element „wiersz”:

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

Tak długo, jak ekran jest wyświetlany statycznie (bez ruchu), będzie wyświetlany poprawnie, ale kiedy zacznę przewijać listę, tło elementu wiersza („ikona”, jak można pokazać w kodzie) pokazane poprawnie, ale tło układu „root” stanie się całkowicie czarne ... kiedy przewijanie się zatrzyma, tło w większości odzyska swój kolor ... Podczas testowania dodałem również TextVieww tym elemencie root na tym samym tle, ten zachowa swój kolor, gdy przewinie się listę ... Masz pojęcie, dlaczego tak się dzieje i jak to rozwiązać?

Odpowiedzi:


771

Dodaj atrybut w ListViewtagu

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

Aby uzyskać więcej informacji, sprawdź tego bloga


23
this.getListView (). setCacheColorHint (0); Z układu nie mogłem ustawić koloru. Ale udało mi się to zrobić z powyższym kodem. Użyłem tego kodu w „onCreate” aktywności na liście. Mam nadzieję, że te informacje również pomogą.
Dijo David,

70
android:cacheColorHint="#0000"działa również, jeśli boisz się zer.
Andrew

136
Lub też android:cacheColorHint="@android:color/transparent"jeśli boisz się liczb :)
dule

2
@ android: kolor / przezroczysty prawdopodobnie ma dodatkową zaletę posiadania jednego zestawu bitów. Istnieje błąd, w którym jeśli przejdziesz 0 na niektórych telefonach, przezroczystość nie będzie działać. Sztuką jest ustawienie 1 bitu.
Thomas Dignan,

63

To bardzo proste, wystarczy użyć tej linii w pliku układu:

android:scrollingCache="false"

lubię to:

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

2
Działa, ale nie sądzę, że jest to mądre: stackoverflow.com/questions/15570041/scrollingcache
Morten Holmgaard

1
Miałem przypadek, w którym android: cacheColorHint = "# 00000000" nie działał, ale android: scrollingCache = "false" zadziałał. Dzięki.
Yar

27

możesz użyć w ten sposób:

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

Mamy wiele opcji dla tego problemu, możesz ustawić tło jako przezroczyste poprzez programowanie jak

yourlistview.setCacheColorHint(Color.TRANSPARENT); 

lub poprzez xml

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

5

W xml gdzie użyć Listviewzestawu

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

5

Używam obrazów listViewi czasami robi się czarny w samsung s4, nawet nie przewijając. To był głupi błąd, który popełniłem w adapterze. Po prostu ustawiłem swój widok na zero, aby naprawić ten problem

 @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

Istnieje wiele odpowiedzi na to pytanie, ale dzisiaj zdałem sobie sprawę, że w tym pytaniu wciąż brakuje krytycznej informacji.

Istnieją dwa możliwe rozwiązania problemu, oba działają, ale każde z nich powinno być stosowane w różnych sytuacjach.


Metody

Użyj android:cacheColorHintkiedy wasz ListViewposiada solidną kolor tła.

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

Użyj, android:scrollingCachegdy masz ListView(złożony) obraz jako tło.

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

Uwaga

Gdy twoje ListViewtło ma jednolity kolor, obie metody będą działać, więc nie tylko cacheColorHintbędą działać. Nie zaleca się jednak używania scrolingCachemetody dla jednolitych kolorów tła, ponieważ wyłącza ona metodę optymalizacji używaną do płynnego animowania i przewijania ListView.

Uwaga do notatki: scrolingCache ustawienie na false nie musi oznaczać, że ListViewanimacje będą się przewijać powoli.




1

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

lub

nie ustawiaj tła listview.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.