Вырвал свои волосы, пытаясь заставить Android ListView делать то, что я хочу.
Я хочу иметь ListView в режиме единого выбора с пользовательским макетом строки, который имеет другой цвет фона для выбранного, нажатого и отмеченного (т. Е. Выбор отображается цветом, а не галочкой - это то, что я хотел бы обычно называют «выделение», но выделение в андроиде кажется строкой, которую я собираюсь выбрать, прежде чем нажать ее)
Я думал о попытке выбора фона с тремя состояниями. Он прекрасно работает для state_selected и state_pressed, но не для state_checked. Поэтому я создал CheckableRelativeLayout, который расширяет RelativeLayout и реализует Checkable и используется для представления каждой строки.
Здесь показана упрощенная версия:
<my.package.CheckableRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/bkg_selector">
>
<ImageView android:id="@+id/animage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
/>
</my.package.CheckableRelativeLayout>
bkg_selector выглядит как
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/purple" />
<item android:state_checked="true" android:drawable="@drawable/red" />
<item android:state_selected="true" android:drawable="@drawable/darkpurple" />
<item android:drawable="@drawable/black" />
</selector>
Цвета определены в другом месте.
Это все еще не сработало. Поэтому в пользовательском адаптере ListAd я отслеживал «проверенную» строку и пытался (в getView)
if (position == checkedPosition)
. Ret.getBackground () SetState (CHECKED_STATE_SET);
И это ВСЕ ЕЩЕ не работает. Как я могу заставить его делать то, что я хочу?