Выделите выделенный элемент в «ListFragment»?

Я опубликовал одну и ту же проблему пару раз, но она еще не решена. У меня есть ListFragment и я хочу выделить выделенный элемент в списке. Мне дали предложения использовать «селектор». Я не понимаю, как использовать этот селектор. Класс ListFragment :

 // Create an adapter with list of stores and populate the list with // values ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, StoreList); setListAdapter(adapter); mDbHelper.close(); } /* * (non-Javadoc) * * Handles the event when an item is clicked on left pane, performs action * based on the selection in left pane * * @see android.app.ListFragment#onListItemClick(android.widget.ListView, * android.view.View, int, long) */ @Override public void onListItemClick(ListView l, View v, int position, long id) { String selectedStore = (String) getListAdapter().getItem(position); DetailFragment fragment = (DetailFragment) getFragmentManager() .findFragmentById(R.id.detailFragment); if (fragment != null && fragment.isInLayout()) { v.setBackgroundColor(getResources().getColor(R.color.BLUE)); // passes selectedStore to detail fragment fragment.setText(selectedStore); // getItemList(selectedStore); } 

Использование setBackground устанавливает цвет навсегда, но я хочу, чтобы он исчез, когда выбран другой элемент. Я понимаю, как использовать селектор в ListView но в моем случае, если я не определил какой-либо xml для Listview , тогда как бы я использовал «селектор»? Я использую android.R.layout.simple_list_item_1 который предопределен.

Solutions Collecting From Web of "Выделите выделенный элемент в «ListFragment»?"

Для меня работали:

Рез / цвет / menu_highlight.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/red" /> <item android:state_selected="true" android:drawable="@color/red" /> <item android:drawable="@color/white" /> </selector> 

Рез / значения / colors.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="red">#FF0000</color> </resources> 

Res / layout / menuitem.xml :: (XML для каждого элемента в списке)

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:id="@+id/textmenu" android:layout_height="wrap_content" android:text="text" android:textColor="#FFFFFF" android:background="@color/menu_highlight" android:visibility="visible" android:layout_width="fill_parent" /> </LinearLayout> 

Наконец, в классе ListFragment добавьте View previous и добавьте следующий код в функцию onlistitemclick .. (упомянутый в ListFragment: выделите выбранную строку )

 public class MenuListFragment extends ListFragment{ View previous; @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); //Logic to highlight selected item previous.setSelected(false); v.setSelected(true); previous=v; } } 

Из setChoiceMode(ListView.CHOICE_MODE_SINGLE) вызовите setChoiceMode(ListView.CHOICE_MODE_SINGLE) . Затем, когда вы хотите выделить выделенный элемент, вызовите setItemChecked(index, true) .

Я попробовал то же самое, и я не нашел хорошего решения. Фактически я использую этот код для установки слушателя:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ public void onItemClick(AdapterView<?> parent, View view, int position, long id){ list_adapter.setSelectedPosition(position); listView.invalidate(); } }); 

Где адаптер списка определяет следующие общедоступные методы

 @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = GuiBuilder.createHeroListItemView(heroes.get(position),getContext(),parent,false); if(position == selected_pos){ rowView.setBackgroundColor((rowView.getResources().getColor(R.color.list_item_selected_color))); } return rowView; } public void setSelectedPosition(int selected_pos){ this.selected_pos = selected_pos; } public int getSelectedPosition(){ return selected_pos; } 

То есть я изменяю фон элемента списка программно. Кроме того, чтобы избежать эффекта мигания при нажатии элемента списка, я не определяю какой-либо селектор для нажатого состояния

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:drawable="@drawable/list_item_focused_color" /> <item android:drawable="@drawable/list_item_default_color" /> </selector> 

Это работает для меня. Я не нашел лучшего решения, так как setSelected (true) не работает в элементах списка!

Я не получал то, что хотел, поэтому продолжал копать и придумывал «дешевое» решение, которое, возможно, не было лучшей практикой, но выполняло эту работу. Я хотел, чтобы элемент был подсвечен при выборе, и цвет должен исчезнуть, когда другой элемент выбран из спискаFragment. Это то, что сработало для меня – я определил статический View V; И инициализировал его V = new View(getActivity()); Тогда внутри моей

OnListItemClick (ListView l, View v , int position, long id)

  V.setBackgroundResource(0); v.setBackgroundResource(R.color.BLUE); V = v; 

Это работало очень хорошо для меня в 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); } 

Код i

 getListView().setItemChecked(0, true); 

после

 setListAdapter(oAdapter); 

Кодовый блок

Что-то похожее на type-a1pha, но с селекторами, как только у вас есть представление, вы можете view.setSelected (true), и это добавит стиль, который вы определили в своем селекторе. Вам нужно удалить флаг после выполнения действия.