Android: ListActivity, содержащая пользовательские строки и вызывающая ContextMenu - PullRequest
1 голос
/ 01 мая 2011

У меня есть ListView в LitsActivity, состоящий из строк, которые надуваются из отдельного файла XML.Строки заполняются методом convertView в моем настраиваемом адаптере для этого ListView.Я пытаюсь вызвать контекстное меню в каждой строке.Обычно мы делаем это, вызывая метод

registerForContextMenu(ourListViewInstance);

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

registerForContextMenu(row);

в методе getView моего адаптера пользовательского списка, чтобы каждая строка регистрировалась для «длинных кликов», и это работает, но по некоторым причинам это недопустимои обычный путь не требуется.

Это мой ItemsAdapter, который создает экземпляры строк ListView:

class ItemsAdapter extends ArrayAdapter<ItemsModel> {

    public ItemsAdapter(ArrayList<ItemsModel> list) {
        super(Items.this, R.layout.custom_row_view, list);
    }

    private ItemsModel getModel(int position) {
        return (((ItemsAdapter) itemsList.getAdapter()).getItem(position));
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;

        final ItemsModel currentItemModel = getModel(position); // Model class storing data for all the rows. 
        ItemsResourceManager resourceManager = null; // class used to easily get and set row views.

        if (row == null) {
            row = View.inflate(getBaseContext(), R.layout.custom_row_view, null);
            row.setClickable(true);
            row.setFocusable(true);
            row.setBackgroundResource(android.R.drawable.menuitem_background);
            resourceManager = new ItemsResourceManager(row);
            row.setTag(resourceManager);
        } else {
            resourceManager = (ItemsResourceManager) row.getTag(); //class used to easily get and set row views.
        }
        registerForContextMenu(row);  // works for each separate LisView row

        //... skipped setText actions for this row
        }
        return row;
    }
}

Также я попытался полностью очистить свой custom_row_view.xml от любых фокусируемых элементов, но это не помогло.

1 Ответ

1 голос
/ 05 мая 2011

Проблема была в onClickListener в моем пользовательском классе адаптера.Это предотвращало обработку contextMenu, потому что «короткий» щелчок вызывался каждый раз.Теперь и обработчик clickListener, и обработчик ContextMenu находятся в классе ListActivity, и он работает просто отлично.

...