Наконец-то мне удалось найти решение самостоятельно. Я сделал несколько разных шагов:
Шаги, связанные с кодом:
Я переместил весь код, связанный с ActionMode, из класса адаптера в класс активности. До этого я активировал режим действия, используя OnLongClickListener в моем TextView в моем элементе ListView, потому что в тот момент я не знал, как сделать текст TextView доступным для ActionMode (я хочу иметь возможность удалить его, щелкнув значок в панели действий). Когда вы используете CLickListener для одного из элементов ListView, он как бы блокирует OnClickListener элемента ListView, который вы установили в своей деятельности. Не делай этого!!!
Я установил OnItemLongClickListener в свой ListView в своей деятельности. Оттуда я запускаю ActionMode И сохраняю текст из TextView элемента следующим образом (itemNames
— это List<String>
, установленный для моего адаптера, deleteString
— это атрибут класса моей активности):
deleteString = itemNames.get(_postion);
Но эти шаги были нужны только для того, чтобы мой код работал так, как он должен, из-за изменений, которые мне пришлось внести через XML.
Шаги, связанные с XML:
- Мне пришлось удалить фоновый атрибут из основного макета элемента ListView.
- Мне пришлось добавить следующие атрибуты в макет внешней строки:
android:clickable="true"
и android:longClickable="true"
(может быть, longClickable уже достаточно, просто чтобы быть уверенным ;-))
- Мне пришлось создать собственный селектор и установить его в качестве фона для моего макета элемента ListView:
android:background="@drawable/my_selector"
Таким образом я добился следующего:
- У меня есть ListView в моей деятельности с настраиваемым макетом (TextView + CheckBox) и настраиваемым адаптером.
- Я могу использовать OnCheckedChangeListener в CheckBox
- Я могу активировать ActionMode, выполнив долгий щелчок по моему элементу ListView И достигнув содержимого TextView для дальнейших процессов.
- Я получаю подсветку фона holo_blue_light по умолчанию в своем элементе ListView, когда я нажимаю на него (я использую Holo Theme Light с темной панелью действий для своего приложения)
Единственное, что мне не удалось сделать с помощью 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>
person
kaolick
schedule
26.02.2013