Нужна помощь с селектором цветов для отмеченных элементов ListView

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

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@android:color/black" /> <item android:state_checked="true" android:drawable="@android:color/black" /> <item android:state_selected="true" android:drawable="@color/red" /> <item android:drawable="@android:color/white" /> </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="@android:color/black" /> <item android:state_checked="true" android:drawable="@android:color/black" /> <item android:state_selected="true" android:drawable="@color/red" /> <item android:drawable="@color/gray" /> </selector> 

Элемент списка ListView выглядит так:

 <?xml version="1.0" encoding="utf-8"?> <com.androidhub.core.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="40dip"> <TextView android:text="TextView" android:id="@+id/textView1" android:layout_height="fill_parent" android:layout_width="wrap_content" android:gravity="center_vertical" android:textColor="@color/list_item"></TextView> </com.androidhub.core.CheckableLinearLayout> 

Корневым элементом элемента списка является CheckableLinearLayout: http://paste.org/pastebin/view/28711

ListView имеет один режим выбора (я также пробовал режим множественного выбора, но он также не работает для меня)

 public class MainActivity extends ListActivity { List<String> items = new ArrayList<String>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); items.add("test 1"); items.add("test 2"); items.add("test 3"); items.add("test 4"); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setAdapter(new TestAdapter(this, items)); getListView().setBackgroundColor(getResources(). getColor(android.R.color.white)); } } 

В адаптере для этого ListView я вызываю метод setChecked () CheckableLinearLayout, но он не меняет цвет:

 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(getContext()); View v = convertView; if(v == null) { v = inflater.inflate(R.layout.list_item, null); } if(position % 2 != 0) { v.setBackgroundResource(R.drawable.list_item_even); } else { v.setBackgroundResource(R.drawable.list_item_odd); } if(parent instanceof ListView) { ListView lv = (ListView)parent; if(v instanceof CheckableLinearLayout) { CheckableLinearLayout cll = (CheckableLinearLayout)v; cll.setChecked(lv.isItemChecked(position)); } } return v; } 

Что я делаю неправильно? Я вижу, что элемент state_pressed из селектора работает нормально, а state_checked – нет. Каким будет правильный подход к настройке фона state_checked из XML, а не кода?

Я думаю, вы ищете этот атрибут:

 android:duplicateParentState="true" 

Попробуйте добавить его в свой тег CheckableLinearLayout в свой макет ячейки.

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

Кроме того, после этого изменения, я думаю, вы можете просто удалить весь блок кода, который заставляет CheckableLinearLayout проверяться:

 if(parent instanceof ListView)... 

Попробуйте реализовать getListView (). SetOnItemClickListener:

 OnItemClickListener listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckableLinearLayout r; for(int i = 0; i< lv.getChildCount(); i++) { r= (CheckableLinearLayout)lv.getChildAt(i); if(i==position) r.setChecked(true); else r.setChecked(false); } } }; 

Пробовали ли вы создать XML для хранения списка ListView, подобного этому? В теге @ + id / android: list есть какое-то волшебство.

 <?xml version="1.0" encoding="utf-8"?> <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="@drawable/megaphone_320x480"> <ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/megaphone_320x480" android:cacheColorHint="@drawable/transparent" /> <TextView android:id="@id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@drawable/red" android:gravity="center_vertical|center_horizontal" android:textStyle="bold" android:text="@string/error_no_groups" /> </LinearLayout> 
Intereting Posts
Почему preferences.getString («ключ», «ПО УМОЛЧАНИЮ») всегда возвращает «ПО УМОЛЧАНИЮ»? Передача двойного значения через другой класс в Android Java Недопустимый ключ API от Crashlytics Диспетчер отображения списка ListView на Android 2.3 Android в приложении нескольких покупок «Break On Exception» в Eclipse / Android Как справиться с отменой после удаления, чтобы удалить в android ListView? Высокое разрешение экрана в Android Ошибка карты Android: не удалось получить соединение с заводским клиентом (с правильным ApiKey) Ошибка: выполнение выполнено для задачи ': app: dexDebug'. Закончил с ненулевым значением выхода 2 с Facebook Fresco Как сохранить состояние во время изменения ориентации в Android, если состояние сделано из моих классов? Почему мои обои для домашнего экрана повреждены? Ввести событие движения через окно? Samsung Charge RECORD_SOUND_ACTION Намерение не возвращается при запуске для результата Как получить представление о содержании активности?