Android: регистрация ContextMenu для пользовательского адаптера списка - PullRequest
2 голосов
/ 11 мая 2010

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

registerForContextMenu(getListView());

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

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

Ответы [ 4 ]

9 голосов
/ 29 апреля 2012

Убедитесь, что дочерние элементы 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);
}

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

4 голосов
/ 11 мая 2010

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

3 голосов
/ 02 ноября 2012

Вызовите 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);
        }
}
0 голосов
/ 04 сентября 2011

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

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

Пример:

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

    getListView().setOnCreateContextMenuListener(this);

    //  do adapter calls etc here

}

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

...