Сохранение подсветки выделенного элемента в фрагменте?

У меня есть макет с двумя фрагментами. Фрагмент левой руки – это ListFragment с использованием SimpleCursorAdaptor, в правой части – сведения о элементе, выбранном из списка в левом фрагменте. Я пытаюсь понять, как убедиться, что выбранный элемент из списка был выделен до тех пор, пока не будет выбран другой элемент в списке.

После некоторых исследований я попытался использовать android:background="@drawable/item_selector" Я могу изменить цвета для разных состояний, но ни один из них, похоже, не сохраняется. Я думал, что выбранный … было бы логично, что выбранный вами элемент остается выбранным, пока вы не выберите другой.

Я даже пытался использовать v.setSelected(true); В моем кликере, надеясь, что он может поддерживать состояние, но это тоже не сработало.

Есть ли состояние, в котором я отсутствую? Я просмотрел dev-документы, и ничто другое не казалось подходящим …

item_selector.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/green" /> <item android:state_selected="true" android:drawable="@color/blue" /> </selector> 

Я не уверен, что может помочь другой код, поэтому не стесняйтесь спрашивать о том, что еще может вам понадобиться.

Solutions Collecting From Web of "Сохранение подсветки выделенного элемента в фрагменте?"

Ответ был сделан в документации по андроиду после дальнейших исследований (на самом деле две части документации).

Во-первых, в сенсорном режиме нет выбранного или сфокусированного состояния.

Во-вторых, по умолчанию listviews устанавливаются в режим выбора none (что означает, что ни один элемент в списке не может иметь выбранное состояние). Все, что мне нужно было сделать, это изменить режим выбора (он может быть один или несколько, мне нужен только один), добавив следующее:

 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Затем я использовал состояние выбора в своем селекторе XML (переводится в activated состояние):

 <item android:state_activated="true" android:drawable="@color/blue" /> 

Примените это в XML-файле макета строки в качестве фона:

  <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="35dp" android:background="@drawable/item_selector" android:gravity="center_vertical"/> 

Мой выбранный элемент теперь отображается с синим фоном, пока не будет выбран другой элемент.

Обратите внимание, что для этого (android: state_activated) требуется Android API 11 или новее.

Я считаю, что вам нужно добавить state_focused, чтобы он чувствовал себя выбранным или выделенным.

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/green" /> <item android:state_selected="true" android:drawable="@color/blue" /> <item android:state_focused="true" android:drawable="@color/red" /> </selector> 

Это работало очень хорошо для меня в ListFragment , но я думаю, что он работает только для Android 4.0 и выше. Я создал простой макет для элемента списка с android:background="?android:attr/activatedBackgroundIndicator (в случае Android ниже 4.0 вам нужно переместить аналогичное в drawables):

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:gravity="center_vertical" android:background="?android:attr/activatedBackgroundIndicator" android:orientation="horizontal" > <TextView android:id="@+id/list_item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:layout_margin="@dimen/double_view_margin" /> 

А затем просто создайте простой ArrayAdapter используя этот макет, и установите режим выбора в одиночном режиме:

 final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels); setListAdapter(labelsAdapter); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

После этого вы можете выделить необходимый элемент с setItemChecked метода setItemChecked :

 @Override public void onListItemClick(final ListView l, final View v, final int position, final long id) { getListView().setItemChecked(position, true); }