Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

1) установите choiceMode в ListView на singleChoice

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

2) Элементы списка должны быть Checkable Просмотр и использование Color State List в качестве фона

например: 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>

Ответ 3

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

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

Ответ 4

Я решил это, расширив 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/

Ответ 5

Вот мое решение Список просмотров:

<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" />

Ответ 6

добавить android:background="?activatedBackgroundIndicator
для отображения основного макета элемента, аналогичного android.R.layout.simple_list_item_activated_2.xml

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

  • 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); }
    
  • ArrayAdapter владеет списком для полей ключа для выбранных элементов и предоставляет методы менеджера addSelection (MyEntity) и clearAllSelections(). Метод overriden getView() читает список полей ключа и, если фактическое положение находится там, изменяет цвет TextView на серый, в противном случае - прозрачный.

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

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

Ответ 10

У меня была та же проблема, я решил ее, вставив следующий код в код 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>

Ответ 11

В моем случае при использовании 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() при каждом изменении выбранного элемента.

Ответ 12

Вот что я сделал:) - после того, как главная голова ударила по стене.

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

 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
     }
 });