onCreateContextMenu вызывается с нулевым значением для ContextMenuInfo - PullRequest
5 голосов
/ 12 ноября 2009

Я пытаюсь использовать ContextMenu. Я успешно сделал это для простого ListActivity с использованием SimpleCursorAdapter.

Продолжая, я хочу заменить SimpleCursorAdapter на CursorAdapter, но при этом сохранить поведение ContextMenu, поэтому я добавил две обязательные функции переопределения bindView и newView

public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = mLayoutInflater.inflate(R.layout.check_row, parent, false);
    registerForContextMenu(view);
    return view;
}

Обратите внимание на registerForContextMenu, который заменяет registerForContextMenu (getListView ()) в методе onCreate объекта ListActivity. Я нашел это необходимым, чтобы получить вызов onCreateContextMenu (...)

Все это работает (строки, созданные с ожидаемыми виджетами, обратные вызовы для них работают и т. Д. И т. Д.), За исключением того, что параметр ContextMenuInfo, предоставленный для onCreateContextMenu (...), теперь является нулевым - мешает мне получить доступ к rowId.

Есть ли еще один трюк для выполнения - возможно, в методе bindView (...) CursorAdapter?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2009

Я отвечаю на вопрос - но я хотел бы отметить, что commonsware.com предоставил подсказки и направление, см. Выше.
Проблема
- Использование CheckBox в макете строки влияет на использование контекстных меню
- CheckedTextView, я полагаю, предназначен для множественного выбора, он не поддается инициализации проверенного состояния.

Решение, которое я принял, делает следующее
1. Используйте CheckedTextView
2. Расширьте из CursorAdapter, чтобы инициализировать проверенное состояние во время bindView (...)
Примечание: это должно управлять отображением правильных значков тоже
3. Управлять состоянием CheckedTextView в onListItemClick (...) и записывать его в базу данных, не забывая обновить курсор.

1 голос
/ 12 ноября 2009

Это не правильный подход. Вы регистрируете контекстное меню для ListView, а не для строк. Позвоните registerForContextMenu() заранее, возможно, через onCreate() после того, как вы надуете макет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...