выделение выбранного элемента в списке в Android - PullRequest
41 голосов
/ 02 мая 2011

У меня 1 просмотр списка contactslist. Я написал код для выделения выбранного элемента в ListView. Это работает. Когда я нажимаю на 1 элемент, он выделяет этот элемент, но проблема в том, что если я нажимаю на другой элемент, он тоже выделяется. Я хочу выделить только выбранный элемент. Предыдущий выбор исчезнет, ​​когда я нажму на другой элемент.

arg1.setBackgroundResource(R.drawable.highlighter);

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

Обновление
Я устанавливаю фон строк в адаптере:

public int[] colors = new int[]{0xFFedf5ff, 0xFFFFFFFF}; 
public int colorPos; 

[...]
colorPos = position % colors.length; 
row.setBackgroundColor(colors[colorPos]);

Ответы [ 4 ]

114 голосов
/ 02 мая 2011

ListViews по умолчанию не имеет установленного choiceMode (установлено none), поэтому текущий выбор не отображается визуально.

Чтобы изменить это, вам просто нужно установить атрибут choiceMode вашего ListView на singleChoice.Если вы хотите создать собственный фон для выбранных элементов в списке, вы также должны установить атрибут listSelector.Там вы можете указать не только цвета, но и объекты для рисования (изображения, слои / объекты для рисования).

<ListView android:id="@+id/my_list"
        android:choiceMode="singleChoice" 
        android:listSelector="@android:color/darker_gray" />

Если вы не используете ListView напрямую, а ListActivity, то этиатрибуты должны быть установлены из кода, поэтому вы должны расширить метод вашей деятельности onCreate следующими строками:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setSelector(android.R.color.darker_gray);

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

Ответ на обновление

Если вы устанавливаете фон из метода getView, вместо использования статического цветаПримените список состояний, который можно нарисовать, к фону строки с duplicateParentState, установленным в true.Таким образом, он изменит свое отображение в зависимости от текущего состояния элемента: обычный, сфокусированный, нажатый и т. Д.

26 голосов
/ 23 апреля 2014

В XML списка просмотра добавьте режим «singleChoice»

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:choiceMode="singleChoice"
    (...) >
</ListView>

В макете элемента списка добавьте

android: background = "? Android: attr / activBackgroundIndicator

пример

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="horizontal"
   android:background="?android:attr/activatedBackgroundIndicator">

     <!-- your item content-->

</LinearLayout> 
8 голосов
/ 22 апреля 2014

Лучший способ в твоей теме, @ Вытяжка / list_selector

list_selector.xml:

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

затем установите фон для корня вашего list_row.xml android: background = "? Android: attr / activBackgroundIndicator"

0 голосов
/ 15 сентября 2011

Попробуйте это на onListItemClick

view.getFocusables(POSITION);
view.setSelected(true);

Подсвечивает выделение.

...