Выделите выбранную строку ListView

У меня есть список альбомов (несколько сотен). Когда я прикасаюсь к выбранному альбому, я хочу предложить пользователю выбор для воспроизведения всего альбома или перехода к его списку ListView. Нет проблем. Однако после касания аблама в albumListView я хочу, чтобы строка оставалась подсвеченной, поэтому пользователь знает, на какой элемент они нажали, и затем может перейти к OK или PLAY. Как выделить строку в ListView?

Solutions Collecting From Web of "Выделите выбранную строку ListView"

Цитата из http://android-developers.blogspot.de/2008/12/touch-mode.html

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

В этом случае, если пользователь выбирает элемент в верхней части списка, а затем отображает список в нижней части, что должно произойти с выбором? Должна ли она оставаться на предмете и прокручивать экран? Что должно произойти, если пользователь решил переместить выделение с помощью трекбола? Или, что еще хуже, что должно произойти, если пользователь нажимает на трекбол, чтобы действовать на текущий выбранный элемент, который больше не отображается на экране?

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

В режиме касания нет фокуса и выбора. Любой выбранный элемент в списке в сетке становится не выбранным, как только пользователь переходит в режим касания. Аналогичным образом, любые сфокусированные виджеты становятся несфокусированными, когда пользователь вводит сенсорный режим. На следующем рисунке показано, что происходит, когда пользователь прикасается к списку после выбора элемента с трекболом.

Другое решение (в основном в XML)

1) установите для параметра choiceMode ListView значение singleChoice

 <ListView android:choiceMode="singleChoice" .../> 

2) Элементы списка должны быть просмотренным видом и использовать список состояний цвета в качестве фона

Например: album_item.xml

 <?xml version="1.0" encoding="utf-8"?> <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/list_selector" .../> 

3) фоновое состояние цвета ( list_selector.xml ) определяет цвет подсветки

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

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

Вы можете использовать CHOICE_MODE_SINGLE, чтобы выразить выбор состояния в списке. Он будет рассматривать выбор как проверенное состояние. Пока представление, которое возвращает ваш адаптер, реализует интерфейс Checkable, вы можете отобразить выбранное состояние, но вы выбираете. (Настройка фона в представлении элемента или иначе. На самом деле не нужно показывать виджет с флажком.) Затем вы можете использовать элементы, проверенные методами ListView, для управления или определения выбора.

Я решил это, расширив ListView и переопределив метод getView (). Я сохранил внутренний идентификатор для «выбранного» состояния и изменил фон элемента в соответствии с ним, например:

 @Override public View getView(int position, View convertView, ViewGroup parent) { View currView = super.getView(position, convertView, parent); StateListItem currItem = getItem(position); if (currItem.isItemSelected) { currView.setBackgroundColor(Color.RED); } else { currView.setBackgroundColor(Color.BLACK); } return currView; } 

У меня есть пример программы на моем блоге: http://udinic.wordpress.com/2011/07/01/selectablelistview-make-selection-work/

Вот мое решение Listview:

 <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:divider="@android:color/darker_gray" android:dividerHeight="1dp" android:paddingLeft="10dip" android:paddingRight="10dip" android:choiceMode="singleChoice" android:paddingTop="8dip" > </ListView> 1 <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:divider="@android:color/darker_gray" android:dividerHeight="1dp" android:paddingLeft="10dip" android:paddingRight="10dip" android:choiceMode="singleChoice" android:paddingTop="8dip" > </ListView> 

Напишите селектор для list_row как

 <!-- <item android:drawable="@color/android:transparent" android:state_selected="true" /> --> <item android:drawable="@android:color/darker_gray" android:state_selected="true"/> <item android:drawable="@android:color/darker_gray" android:state_activated="true"/> <item android:drawable="@android:color/darker_gray" android:state_pressed="true"/> <item android:drawable="@color/android:transparent"/> 

Убедитесь, что у вас есть элемент для state_activated = true

Затем добавьте этот селектор в качестве фона list_row

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/listitem_selector" android:orientation="vertical" > <TextView android:id="@+id/itemName" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Добавить android:background="?activatedBackgroundIndicator
Перечислить основной макет элемента, похожий на android.R.layout.simple_list_item_activated_2.xml

Реализовать свой список с одним режимом выбора: android:choiceMode=singleChoice

Так же, как по умолчанию android.R.layout.simple_list_item_single_choice использует RadioButton для обозначения выбранного выбора, вы можете реализовать пользовательское состояние выделения или подобное в макете списка элементов, чтобы реагировать на изменения выбора. getCheckedItemPosition() методы, такие как getCheckedItemPosition() могут использоваться вашим приложением для определения того, какой элемент пользователь выбрал в случае необходимости.

Надеюсь, это поможет!

Я знаю, что прошло два года с тех пор, как этот вопрос был последним активным, но на случай, если кому-то это понадобится в будущем. Вот мой код ListView xml

 <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/results" android:choiceMode="singleChoice" android:listSelector="#ffdb700b"/> 

Вы хотите изменить значение android:listSelector .

Следующее решение может использоваться для выделения одного или нескольких элементов списка. Начальная точка: существует список, чтобы отобразить список MyEntity с помощью реализации ArrayAdapter. Цвет элемента TextView как часть макета элемента должен измениться на серый, если элемент выбран. Необходимо выбрать несколько элементов.

  1. ListFragment должен предоставить элемент OnItemSelectListener (элемент YourEntity), который будет вызываться в onListItemClicked ().

     public void onListItemClick(ListView l, View v, int position, long id) { MyEntity entity = (MyEntity) getListView().getItemAtPosition(position); if (entityListSelectListener != null) itemSelectListener.onItemSelect(entity); } 
  2. ArrayAdapter владеет списком для ключевых полей для выбранных элементов и предоставляет методы менеджера addSelection (MyEntity) и clearAllSelections (). Метод overriden getView () считывает список ключевых полей и, если фактическое положение находится там, изменяет цвет TextView на серый, в противном случае – прозрачным.

     public View getView(int position, View convertView, ViewGroup parent) { ... if (selectedEntityList.contains(entity.key)) //... highlight view field } 
  3. В onCreate () активности владельца слушатели должны быть реализованы для управления ArrayAdapter: вызов addSelection () и notifyDataSetChanged ().

     entityListFragment.setEntityListSelectListener( new EntityListFragment.OnItemSelectedListener() { public void onItemSelect(MyEntity entity) { aa.addSelection(entity); aa.notifyDataSetChanged(); }}); 

У меня была та же проблема, я решил ее, вставив следующий код в код ListView

 android:choiceMode="singleChoice" android:listSelector="#003366" 

Файл xml выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/file_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:choiceMode="singleChoice" android:listSelector="#003366"/> <Button android:id="@+id/select" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="SELECT" android:layout_below="@id/file_list"/> </RelativeLayout> 

В моем случае при использовании simple_list_item_2 единственным решением было переопределить метод getView () адаптера и просто изменить цвет фона вручную:

 listview = new SimpleAdapter(ctx, data, android.R.layout.simple_list_item_2, res, new String[] {"field1", "field2" }, new int[] {android.R.id.text1, android.R.id.text2 }) @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); if (this_is_the_selected_item) { view.setBackgroundColor(0xff999999); } else { view.setBackgroundColor(Color.BLACK); } return view; } }; 

Не забудьте вызвать listview.invalidateViews () всякий раз, когда вы меняете выбранный элемент.

Вот что я сделал 🙂 – после того, как крупная голова ударилась о стену.

Для адаптера:

  radioAdapter = new RadioAdapter(context, R.layout.row_layout, yourData); 

Для row_layout.xml:

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/radio_name" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_vertical" android:padding="10dp" android:background="?android:attr/activatedBackgroundIndicator" android:clickable="true" android:text="SOME RADIO" android:textColor="@color/Gray" android:textSize="25dp" /> 

Чтобы установить выделенную по умолчанию позицию для выделения, просто сделайте это для своего объекта listView:

RadioTitleList.setItemChecked (defaultPosition, true);

Если вы хотите выделить, когда вы нажимаете на список:

В вашем getView () в вашем адаптере пользовательского списка добавьте это, прежде чем возвращать представление:

  row.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { radioTitleList.setItemChecked(position, true); // other stuff like navigating to a new activity etc } });