Доступ к тексту элемента ListView из контекстной панели действий - PullRequest
1 голос
/ 23 марта 2012

Мне нужно получить доступ к тексту в элементе ListView с помощью длинного выбора.Для старых версий Android я успешно сделал это с помощью контекстных меню с кодом ниже.

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    String text = ((TextView) info.targetView).getText().toString();

    switch (item.getItemId()) {
        case R.id.getText:
            getText(text);
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

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

    myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    myListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        String text = ((TextView) info.targetView).getText().toString();

            switch (item.getItemId()) {
                case R.id.contextDelete:
                    getText(text);
                    return true;;
                default:
                    return false;
            }
        }

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.context_menu, menu);
            return true;
        }

        //Other actionmode methods...
    });

Контекстная панель действий отображается нормально, но при выборе элемента из нее я получаю исключение NullPointerException в строке AdapterContextMenuInfo, поскольку это было очевидно сделано для контекстных меню, а не для панелей действий.Может быть, есть какой-то эквивалент для панелей действий?Или как я могу получить текст элемента ListView в этом случае?Спасибо.

Ответы [ 2 ]

11 голосов
/ 23 марта 2012

getCheckedItemPositions() on ListView вернет позиции элементов, которые проверил пользователь, и getCheckedItemIds() вернет их значения ID, если вы используете что-то вроде CursorAdapter.

Вот пример проекта , демонстрирующий использование CHOICE_MODE_MULTIPLE_MODAL на уровне API 11+ и возврат к контекстным меню на старых устройствах.

1 голос
/ 04 мая 2012

Я пытался использовать метод getCheckedItemIds() для объекта ListView, и он ничего не возвращал (я не использовал объект Cursor). Оказывается, это общая проблема, с которой сталкиваются люди. Поэтому я нашел обходной путь для этого. В моей ситуации мне пришлось использовать идентификаторы элементов для создания уведомлений (просто пробуя некоторый пример кода), поэтому я сделал это, чтобы получить их:

Я создал ArrayList для хранения идентификаторов всех выбранных элементов. Каждый раз, когда проверяется элемент, вызывается метод onItemCheckedStateChanged(..). Мы можем использовать этот метод для обновления ArrayList идентификаторов на основе изменения состояния. Затем мы можем использовать идентификаторы, хранящиеся в этом списке, когда пользователь выбирает опцию и вызывается метод onActionItemClicked(). Вот код:

lv.setMultiChoiceModeListener(new MultiChoiceModeListener() {
            private ArrayList<Long> checkedIds = new ArrayList<Long>();

                    //Code omitted for brevity

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                menu.add(0, 1, 0, R.string.context_create_notification);
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                switch(item.getItemId()){
                case 1:
                    for(long id : checkedIds){
                        createNotification(id+1);
                    }
                    mode.finish();
                    break;
                }
                return true;
            }

            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position,
                    long id, boolean checked) {

                if(checked){
                    checkedIds.add(id);
                } else{
                    Iterator<Long> iter = checkedIds.iterator();
                    while(iter.hasNext()){
                        long stored = (Long) iter.next();
                        if(stored == id){
                            iter.remove();
                        }
                    }
                }
            }
        });
...