ContextMenu не будет отображаться в ListView при использовании SimpleCursorAdapter - PullRequest
0 голосов
/ 10 октября 2011

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

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

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

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

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


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

<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 ), но ни один из их зовут.

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

С уважением Mirec

Ответы [ 5 ]

1 голос
/ 28 апреля 2015
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            return false;
        }
    });

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

1 голос
/ 25 августа 2012

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

focusable="false"
1 голос
/ 10 октября 2011

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

    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 - используйте минимальный рабочий пример, а затем выясните, в чем причина проблемы.

0 голосов
/ 22 апреля 2013

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

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

@Override
public boolean hasStableIds() {
    return true;
}
0 голосов
/ 14 апреля 2013

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

listviewobject.setClickable (правда)

...