ContextMenu не будет отображаться в ListView при использовании SimpleCursorAdapter

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

Основное действие расширяет MapActivity, поскольку оно также содержит карту... ListView использует SimpleCursorAdapter.

Представление списка регистрируется для контекстного меню в методе onCreate основного действия:

  alarmList = (ListView) findViewById (R.id.alarmList);
  registerForContextMenu(alarmList);

И основное действие переопределяет методы onCreateContextMenu, а также методы onContextItemSelected, но они никогда не вызываются при щелчке элемента.


Мне было интересно, что при использовании ArrayAdapter и простого строкового отображения элемента контекстное меню списка работает хорошо, и список обеспечивает хороший выбор элементов при нажатии (с хорошим эффектом затухания) . Но когда я меняю адаптер на SimpleCursorAdapter, представление списка вообще не реагирует на нажатие. Чтобы «симулировать» клики, я добавил атрибут clickable в ListView:

<ListView android:id="@+id/alarmList" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true"/>

И один элемент списка отформатирован с использованием собственного макета, который начинается так: [alarm_list_item.xml:]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linearLayout" android:layout_width="match_parent" android:background="@color/alarm_list_bg"
    android:clickable="true" android:baselineAligned="true" android:layout_height="wrap_content" android:minHeight="65dp">
...

[alarm_list_bg:]

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

Я пытался зарегистрировать несколько прослушивателей непосредственно в экземпляре ListView (OnItemLongClickListener, OnCreateContextMenuListener, OnItemClickListener), но ни один из них называется.

Не могли бы вы подумать, что может быть не так?

С уважением Мирец


person MirecXP    schedule 10.10.2011    source источник
comment
Вот пример проекта, демонстрирующий использование контекстного меню с SimpleCursorAdapter: github.com/commonsguy/cw-android/tree/master/Database/Constants   -  person CommonsWare    schedule 10.10.2011
comment
Спасибо за ваши комментарии. Я нашел проблему, она была вызвана двумя вещами: 1. флажок в представлении элемента, 2. кликабельный атрибут. Как я могу установить флажок в представлении элемента, поскольку он не крадет фокус всего элемента? Я временно переместил действие в контекстное меню, но хотел бы, чтобы оно было прямо в строке списка...   -  person MirecXP    schedule 11.10.2011
comment
Я не совсем уверен, что вы имеете в виду. Вот пример проекта, показывающий использование контекстного меню с CHOICE_MODE_MULTIPLE ListView: github.com/commonsguy/cw-advandroid/tree/master/Honeycomb/ Обратите внимание, что здесь также показано использование режима действия для Honeycomb, поэтому этот пример, возможно, несколько сложнее, чем то, что вам нужно.   -  person CommonsWare    schedule 11.10.2011
comment
Спасибо за ваши примеры, они очень полезны. Но еще раз: если элемент списка содержит флажок (или кнопку изображения, панель рейтинга,...), зарегистрированное контекстное меню не появится при нажатии на элемент списка. Та же проблема в вашем примере RateListViewDemo - если я зарегистрирую контекстное меню для представления списка меню не появится, потому что ratingBar крадет события кликов. Единственный способ обойти это — использовать ImageView вместо флажка или кнопки и зарегистрировать какой-либо метод прослушивания в его событии onClick. Но мне это не нравится, потому что это не дает эффекта клика.   -  person MirecXP    schedule 25.10.2011


Ответы (5)


Попробуйте начать с чего-то вроде

    alarmList.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
                    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {
                            menu.add(0, ENTRY_ADD, 1, "Add");
                            menu.add(0, ENTRY_REMOVE , 2,"Remove");
                    }}); 

Если это не работает, удалите все ненужные атрибуты из XML, такие как android:clickable - используйте минимальный рабочий пример, а затем выясните, что вызвало проблему.

person tomash    schedule 10.10.2011

Попробуйте добавить этот атрибут к флажку:

focusable="false"
person Jinf    schedule 24.08.2012

mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            return false;
        }
    });

не забудьте вернуть false в конце функции «onItemLongClick». Если вы вернете ture, система будет думать, что функция «onItemLongClick» «съедает» событие длительного нажатия.

person jujiaqi    schedule 28.04.2015

ListView не обрабатывает длинный щелчок, пока вы не установите для метода setClickable(true) значение true

listviewobject.setClickable(true)

person The EasyLearn Academy    schedule 14.04.2013

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

Удаление следующего блока решило проблему:

@Override
public boolean hasStableIds() {
    return true;
}
person Medo    schedule 22.04.2013