Android: регистрация ContextMenu для пользовательского ListAdapter

Я сделал собственный адаптер списка, расширяющий базовый адаптер. Каждый элемент в списке имеет кнопку изображения, 2 текстовых представления и кнопку. Я попытался добавить контекстное меню в список, чтобы отобразить некоторые параметры для элемента в списке.

registerForContextMenu(getListView());

Я использовал объект MenuInflater для раздувания XML-файла контекстного меню. Но при щелчке по элементам в списке ничего не появляется или обычное выделение элемента списка при щелчке не отображается. Дело в том, что контекстное меню не работает для пользовательских списков? Любая помощь приветствуется.

С уважением, Primal


person Primal Pappachan    schedule 11.05.2010    source источник


Ответы (4)


Убедитесь, что дочерние элементы ListView должны быть доступны для длительного нажатия.

Это можно сделать в файле макета xml, например:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:longClickable="true">

    <!-- Child elements -->

</LinearLayout>

Или это можно сделать в java-коде:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
   CustomView customView = new CustomView();
   customView.setLongClickeable(true);
}

Я надеюсь, что это помогает.

person David Salgado    schedule 28.04.2012
comment
Спасибо, было так полезно для меня! - person Seyyed; 18.01.2017

Он должен работать для пользовательских адаптеров списков. Единственное, что приходит на ум, это то, что registerForContextMenu() нужно вызывать после setListAdapter() (если вы используете ListActivity).

person Erich Douglass    schedule 11.05.2010
comment
comment
Я сделал то же самое. Но контекстное меню не появляется при долгом клике. :( - person Primal Pappachan; 12.05.2010

При необходимости вызовите registerForContextMenu, onCreateView или onCreate.

registerForContextMenu(getListView());

Реализуйте в своем адаптере, как показано ниже.

 public class CustomeLabelAdpater extends BaseAdapter implements View.OnCreateContextMenuListener{

Поместите эту строку в свой метод getView.

vi.setOnCreateContextMenuListener(this);

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        vi.setOnCreateContextMenuListener(this);
}

Поместите этот метод как пустой в свой адаптер.

 public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
         // empty implementation
       }

Затем вы переопределяете onCreateContextMenu и onContextItemSelected в своем фрагменте или действии.

@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view,
                                ContextMenu.ContextMenuInfo contextMenuInfo) {
    // create context the menu
    Activity.getMenuInflater().inflate(R.menu.context_menu, contextMenu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.open:
                return true;
            default:
                return super.onContextItemSelected(item);
        }
}
person kyogs    schedule 02.11.2012
comment
Потрясающий! Это решило мою проблему - person Bianca Balan; 01.06.2021

У меня была аналогичная проблема с использованием пользовательского адаптера при расширении ListActivity.

Я обнаружил, что должен убедиться, что setContentView вызывается до setOnCreateContextMenuListener, чтобы эти события регистрировались должным образом.

Пример:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    getListView().setOnCreateContextMenuListener(this);

    //  do adapter calls etc here

}

Надеюсь это поможет.

person cweston    schedule 04.09.2011
comment
Вам всегда нужно вызывать setContentView перед этим для чего угодно. - person Michal; 30.01.2014