StateListDrawable в ListView странно неокрашенный в определенных условиях - PullRequest
1 голос
/ 29 октября 2010

Я создал ListView с TextViews в качестве элементов, большинство из которых имеют определенный цвет в качестве фона, но некоторые имеют собственный @ drawable / shape в качестве фона (т. Е. Верхний и нижний элементы, которые имеют закругленные углы).Эти фоны устанавливаются как часть списков состояний, чтобы обеспечить другой цвет фона при нажатии элементов.ListSelector ListView установлен в прозрачный, и вместо этого содержащиеся TextViews в элементах устанавливаются в clickable.

ListView:

<ListView android:id="@+id/allreminders_list" android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:dividerHeight="3px" android:cacheColorHint="#00000000"
android:divider="@color/trans" android:background="@drawable/reminderlist_background"
android:listSelector="@android:color/transparent"/>

Запись ListView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight"
android:id="@+id/entry_container">
<TextView android:id="@+id/remindername" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:text="dummy"
android:padding="15dp" android:layout_marginLeft="15px"
android:layout_marginRight="15px" style="@style/ReminderEntry"
android:clickable="true"/>
</RelativeLayout>

Программная настройка фона записи ListView:

if (position == 1)
textViewReminderName
  .setBackgroundResource(R.drawable.reminder_entry_state_top);
else if (position == remindersInSection)
textViewReminderName
  .setBackgroundResource(R.drawable.reminder_entry_state_bottom);
else
textViewReminderName
  .setBackgroundResource(R.drawable.reminder_entry_state);

Список состояний для верхних элементов (R.drawable.reminder_entry_state_top):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/rounded_top_corners_selected" />
<item android:state_selected="true" android:drawable="@drawable/rounded_top_corners_selected" />
<item android:drawable="@drawable/rounded_top_corners" />

Форма для невыбранныхглавные элементы (@ drawable / rounded_top_corners):

<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="@color/entry_background"/>    
<corners android:bottomRightRadius="0dp" android:bottomLeftRadius="0dp" 
 android:topLeftRadius="5dp" android:topRightRadius="5dp"/> 
</shape>

Этот материал работает, функционально.НО, верхний и нижний элементы (которые имеют нарисованную форму в качестве фона, как показано выше) слегка меняют свой цвет при определенных условиях:

  • После прокрутки списка вниз без остановки касания прокрутки
  • После нажатия любого элемента в списке

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

Что это может быть?Ошибка в способе представления StateListDrawables нарисованных фигур?

1 Ответ

0 голосов
/ 31 октября 2010

После бесконечных исследований и догадок я сам нашел причину: дизеринг!При отключении дизеринга в селекторах списка состояний проблема волшебным образом исчезла:

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:dither="false">

Кажется, что дизеринг применяется только при определенных условиях (как описано выше), что, по-моему, не является ожидаемым поведением, но лечится отключениемэто полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...