Фон ListView становится черным при прокрутке


427

Я создал специальный список, который существует из следующих элементов, чтобы создать прокручиваемый список, в котором каждая строка содержит изображение с левой стороны и некоторый текст с правой стороны:

Чтобы начать с «корневого» макета:

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

а затем в ListView я помещаю следующий элемент «строки»:

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

Пока экран отображается статически (как без движения), он будет отображаться правильно, но когда я начну прокручивать список, фон элемента строки («значок», как это может быть показано в коде) будет отображается правильно, но фон «корневого» макета станет полностью черным ... когда прокрутка останавливается, фон в большинстве случаев возвращается к своему цвету ... Во время тестирования я также добавил TextViewв этот корневой элемент с тем же фоном, этот будет задерживать свой цвет при прокрутке списка ... Есть идеи, почему это происходит, и как это решить?

Ответы:


771

Добавить атрибут в ListViewтег

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

Для более подробной информации проверьте этот блог


23
. this.getListView () setCacheColorHint (0); Из макета я не мог установить цвет. Но мне удалось сделать это с помощью приведенного выше кода. Я использовал этот код в 'onCreate' активности списка. Надеюсь, эта информация также помогает.
Дижо Дэвид

70
android:cacheColorHint="#0000"также работает, если вы боитесь нулей.
Эндрю

136
Или также, android:cacheColorHint="@android:color/transparent"если вы боитесь чисел :)
дуэль

2
@android: цвет / прозрачный, вероятно, имеет дополнительный бонус, если один бит установлен. Существует ошибка, при которой, если вы передадите 0 на некоторых телефонах, прозрачность не будет работать. Итак, хитрость в том, чтобы установить 1 бит.
Томас Диньян

63

Это очень просто, просто используйте эту строку в вашем файле макета:

android:scrollingCache="false"

нравится:

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

2
Это работает, но я не думаю, что это разумно сделать: stackoverflow.com/questions/15570041/scrollingcache
Мортен Холмгаард

1
У меня был случай, в котором android: cacheColorHint = "# 00000000" не работал, но android: scrollingCache = "false" сделал. Спасибо.
Яр

27

Вы можете использовать так:

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

У нас есть много вариантов для этой проблемы, вы можете установить прозрачный фон с помощью программирования, как

yourlistview.setCacheColorHint(Color.TRANSPARENT); 

или через xml

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


5

Я использую изображения в, listViewи он становится черным иногда в Samsung S4 даже не прокручивая. Это была глупая ошибка, которую я сделал в адаптере. Я просто установил свой взгляд на нуль, чтобы исправить эту проблему

 @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

Есть много ответов на этот вопрос, но сегодня я понял, что этот вопрос до сих пор не хватает важной информации.

Есть два возможных решения проблемы, оба работают, но каждый должен использоваться в разных ситуациях.


методы

Используйте, android:cacheColorHintкогда у вас ListViewесть сплошной цвет фона.

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

Используйте, android:scrollingCacheкогда у вас ListViewесть (сложное) изображение в качестве фона.

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

Запись

Когда у вас ListViewсплошной цвет фона, оба метода будут работать, поэтому не только cacheColorHintбудет работать. Но не рекомендуется использовать scrolingCacheметод для однотонных фонов, поскольку он отключает метод оптимизации, используемый для плавной анимации и прокрутки ListView.

Примечание для примечания: scrolingCache значение false не обязательно означает, что ListViewанимация и прокрутка станут медленными.




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.