Как выделить элемент ListView с помощью OnLongClickListener из пользовательского класса Adapter в Android

63
5

Вот что я хочу сделать:

В моей основной деятельности у меня есть ListView с пользовательским адаптером, потому что элемент ListView должен содержать TextView и CheckBox. Когда я долгое время нажимаю на элемент, я хочу использовать контекстный режим действия в ActionBar и HIGHLIGHT для выбранного элемента ListView.

Вот что я сделал:

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

Здесь то, что НЕ работает:

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

спросил(а) 2021-01-25T19:34:26+03:00 6 месяцев назад
1
Решение
90

Наконец-то мне удалось найти решение. Я сделал несколько разных шагов:

Шаги, связанные с кодом:

Я переместил весь код ActionMode из класса адаптера в свой класс активности. До этого я запускал режим действия, используя OnLongClickListener в своем TextView в элементе ListView, потому что в тот момент я не знал, как сделать текст TextView доступным для ActionMode (я хочу, чтобы его можно было удалить, нажав значок в ActionBar). Когда вы используете CLickListener в одном из элементов ListView, он "блокирует" OnClickListener элемента ListView, который вы задали в своей деятельности. Не делай этого !!!

Я установил OnItemLongClickListener в свой ListView в своей деятельности. Оттуда я запускаю ActionMode И сохраняю текст из элемента TextView следующим образом (itemNames - это List<String> установленный для моего адаптера, deleteString - это атрибут класса моей Activity):

deleteString = itemNames.get(_postion);

Но эти шаги заключались только в том, чтобы заставить мой код работать так, как предполагается, из-за изменений, которые я должен был сделать через XML.

Шаги, связанные с XML:

Мне пришлось удалить атрибут фона из основного макета элемента списка ListView Мне пришлось добавить следующие атрибуты в мой внешний макет строки: android:clickable="true" и android:longClickable="true" (возможно, longClickable уже достаточно, чтобы быть уверенным ;-)) Мне пришлось создать собственный селектор, который можно было бы вырезать, и установить его в качестве фона для моего макета элемента android:background="@drawable/my_selector" ListView: android:background="@drawable/my_selector"

Таким образом я достиг:

    У меня есть ListView в моей деятельности с пользовательским макетом (TextView + CheckBox) и пользовательским адаптером Я могу использовать OnCheckedChangeListener на CheckBox Я могу активировать ActionMode, сделав длинный щелчок на элементе ListView и дойду до содержимого TextView для дальнейших процессов Я получаю подсветку фона по умолчанию holo_blue_light в элементе ListView, когда я нажимаю на нее (я использую Theme Theme Theme с Dark Bar для моего приложения)

Единственное, что я не получал, чтобы работать через XML, заключалось в том, чтобы мой элемент ListView был выделен, пока ActionMode был активным, поэтому я сделал это, сделав это

_view.setBackgroundResource(android.R.color.holo_blue_dark);

в OnItemLongClickListener моего ListView в моем классе Activity (не забудьте перерисовать или обновить ListView в onDestroyActionMode(ActionMode _mode) вашего ActionMode.Callback)

Вуаля! Надеюсь, это поможет некоторым из вас! Принял меня несколько дней и много исследований.

Здесь мои примеры кода для моего макета элемента ListView и моего макета селектора:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/my_selector"
android:clickable="true"
android:longClickable="true" >

<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="6dp" >
</CheckBox>

<TextView
android:id="@+id/shoppingListItemName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:layout_toLeftOf="@id/checkBox"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:textIsSelectable="true" >
</TextView>

</RelativeLayout>

Мой селектор:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true">
<layer-list>
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/holo_blue_light" />
</shape>
</item>
</layer-list>
</item>
<item>
<color android:color="#00000000" />
</item>

</selector>

ответил(а) 2021-01-25T19:34:26+03:00 6 месяцев назад
45

Я столкнулся с этим вопросом, потому что столкнулся с одной и той же проблемой, т.е. Хотел выделить элементы списка для просмотра по клику и длинному клику. Это работает для меня. Приемник режима Multi Multi Mode с пользовательским адаптером

ответил(а) 2021-01-25T19:34:26+03:00 6 месяцев назад
45

вы можете установить android: state_activated = true в вашем фону, который можно выровнять из макета строки списка

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_activated="true">
<layer-list >
<!-- <item >
<color android:color="#ff00aa00"/>
</item> -->

<item>
<shape android:shape="rectangle">
<solid android:color="#aa58BAED"/>
<corners android:radius="3px"/>
</shape>
</item>
</layer-list>
</item>
<item >
<color android:color="#00000000"/>
</item>
</selector>

Но он будет работать только для android api> Api 11

ответил(а) 2021-01-25T19:34:26+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема