Android: позиция обратного вызова контекстного меню отключается на единицу, когда ListView содержит заголовок - PullRequest
1 голос
/ 13 мая 2011

У меня есть ListView с заголовком, установленным с помощью ListView.addHeader(...) Кажется, что он работает просто отлично, за исключением попыток создать контекстное меню.

Когда пользователь нажимает строку подряд, позиция вonCreateContextMenu обратный вызов отключен одним.Когда пользователь долго нажимает на заголовок, сообщаемая позиция равна 0 (я бы не ожидал обратного вызова), когда пользователь нажимает долго на первую строку, сообщаемая позиция равна 1 вместо 0 и т. Д.

Тот же код работает, как и ожидалось, без заголовка.

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

Что я вижу ожидаемое поведение?Возможно, я что-то делаю не так?

Вот как я получаю позицию:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    int position = info.position;

    // this is my workaround, but I'm afraid it's going to bite me in
    // the ass if/when GOOG fixes this
    if( this.hasHeader() && position > 0 ) position--;

1 Ответ

2 голосов
/ 13 мая 2011

Я знаю, что внутренне Android просто создает новый адаптер вокруг моего, когда я устанавливаю заголовок, но я предполагаю, что они обрабатывают настройку позиции перед вызовом обратных вызовов.

Я сомневаюсь в этом.Я не пробовал такого специфического поведения, но сам написал адаптеры для переноса, это не легко решаемая проблема.

Проще говоря, контекстное меню вообще не включает Adapter, только AdapterView,Следовательно, для переноса Adapter нет никаких шансов либо потреблять события меню, либо корректировать значения позиции.

Я подозреваю, что вам просто нужно будет вычесть 1 и игнорировать строку заголовка самостоятельно.

...