Hintergrund ListView wird beim Scrollen schwarz

427

Ich habe eine bestimmte Liste erstellt, die aus den folgenden Elementen besteht, um eine scrollbare Liste mit jeder Zeile zu erstellen, die ein Bild auf der linken Seite und Text auf der rechten Seite enthält:

So beginnen Sie mit einem "Root" -Layout:

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

und dann platziere ich in der ListView das folgende "Zeilen" -Element:

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

Solange der Bildschirm statisch angezeigt wird (wie in keiner Bewegung), wird er korrekt angezeigt, aber wenn ich anfange, durch die Liste zu scrollen, wird der Hintergrund des Zeilenelements (ein "Symbol", wie es im Code angezeigt werden kann) angezeigt Wird korrekt angezeigt, aber der Hintergrund des "Root" -Layouts wird vollständig schwarz. Wenn das Scrollen stoppt, erhält der Hintergrund meistens wieder seine Farbe. Beim Testen habe ich auch ein TextViewin diesem Root-Element hinzugefügt Mit dem gleichen Hintergrund behält dieser seine Farbe, wenn die Liste gescrollt wird ... Irgendeine Idee, warum dies geschieht und wie dies gelöst werden kann?

Tiger
quelle

Antworten:

771

Fügen Sie dem ListViewTag ein Attribut hinzu

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

Weitere Details finden Sie in diesem Blog

Praveen
quelle
23
this.getListView (). setCacheColorHint (0); Vom Layout konnte ich die Farbe nicht einstellen. Aber ich habe es mit dem obigen Code geschafft. Ich habe diesen Code in 'onCreate' der Listenaktivität verwendet. Hoffe, diese Informationen helfen auch.
Dijo David
70
android:cacheColorHint="#0000"funktioniert auch, wenn Sie Angst vor Nullen haben.
Andrew
136
Oder auch, android:cacheColorHint="@android:color/transparent"wenn Sie Angst vor Zahlen haben :)
dule
2
@android: color / transparent hat wahrscheinlich den zusätzlichen Vorteil, dass ein einzelnes Bit gesetzt ist. Es gibt einen Fehler, bei dem die Transparenz nicht funktioniert, wenn Sie auf einigen Telefonen 0 übergeben. Der Trick besteht also darin, 1 Bit zu setzen.
Thomas Dignan
63

Es ist sehr einfach, verwenden Sie einfach diese Zeile in Ihrer Layoutdatei:

android:scrollingCache="false"

so was:

<ListView 
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollingCache="false"
/>
Mahesh
quelle
2
Es funktioniert, aber ich denke nicht, dass es klug ist: stackoverflow.com/questions/15570041/scrollingcache
Morten Holmgaard
1
Ich hatte einen Fall, in dem android: cacheColorHint = "# 00000000" nicht funktionierte, android: scrollingCache = "false" jedoch. Vielen Dank.
Yar
27

Sie können wie folgt verwenden:

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

Wir haben viele Möglichkeiten für dieses Problem, Sie können den Hintergrund durch Programmieren wie transparent einstellen

yourlistview.setCacheColorHint(Color.TRANSPARENT); 

oder durch xml

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

In Ihrer XML, wo ListviewSet verwendet werden soll

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

Ich verwende Bilder in listViewund es wird manchmal schwarz in Samsung S4 nicht einmal scrollen. Es war ein dummer Fehler, den ich im Adapter gemacht habe. Ich habe meine Ansicht einfach auf null gesetzt , um dieses Problem zu beheben

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

Es gibt viele Antworten auf diese Frage, aber heute habe ich festgestellt, dass dieser Frage immer noch eine wichtige Information fehlt.

Es gibt zwei mögliche Lösungen für das Problem, beide funktionieren, aber jede sollte in unterschiedlichen Situationen verwendet werden.


Methoden

Verwenden Sie, android:cacheColorHintwenn Sie ListVieweinen hat feste Farbe Hintergrund.

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

Verwenden android:scrollingCacheSie ListViewdiese Option, wenn Sie ein (komplexes) Bild als Hintergrund haben.

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

Hinweis

Wenn Sie ListVieweinen einfarbigen Hintergrund haben, funktionieren beide Methoden, also nicht nur die cacheColorHint. Es wird jedoch nicht empfohlen, die scrolingCacheMethode für einfarbige Hintergründe zu verwenden, da sie eine Optimierungsmethode deaktiviert, die zum reibungslosen Animieren und Scrollen der ListView verwendet wird.

Hinweis für den Hinweis: scrolingCache Wenn Sie auf "false" setzen, bedeutet dies nicht unbedingt, dass die ListViewAnimationen und das Scrollen langsam werden.

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

Folgendes hat bei mir funktioniert:

myListView.setScrollingCacheEnabled(false);
Fauler Ninja
quelle
1

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

oder

Hintergrund nicht setzen von listview.

Akshay Paliwal
quelle