Как выбрать элемент ListView после длительного клика?

У меня есть глупая маленькая проблема. Я зарегистрировал ListFragment как OnItemClickListener и OnItemLongClickListener своего собственного ListView .

Когда вызывается событие onItemClick , запускается намерение для активности с подробным представлением этого элемента, никаких проблем нет.

Когда происходит событие onItemLongClick , я хочу выполнить следующие действия:

  • Создать CAB
  • Сохраняйте выбранный длинный файл

Код:

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    if(this.cabMode != null)
        return false;
    this.cabMode = getActivity().startActionMode(editModeCallback);
    view.setSelected(true);
    return true;
}

CAB покажет, что выбор не останется с элементом.

Некоторые биты и куски, если они актуальны: я прочитал об исправлении этой проблемы с вызовами view.requestFocusFromTouch() или с помощью listView.setItemChecked() , но это не сработало для меня. Кроме того, представления элементов списка отображаются из пользовательского макета, но не имеют каких-либо пользовательских прослушивателей событий.

Любая помощь приветствуется. Спасибо!

12
nl ja de
после длительного нажатия перейдите к позиции выбранного элемента.
добавлено автор kyogs, источник
Вы сделали ListView.setChoiceMode (...) ? Если вы не нашли способ исправить это, вы всегда можете сделать выбор вручную, как здесь goo.gl/7aQAn
Куда я должен его пропустить? listView.setItemChecked() принимает аргумент позиции, но вызов его не имеет эффекта.
добавлено автор Chris, источник
Нет, я не. Спасибо за указатель. Я пробовал несколько комбинаций режимов выбора с вызовами на listView.setItemChecked() и view.setSelected() , но все равно никакого эффекта. Я посмотрю на код Шерлока, однако я бы подумал, что то, что я пытаюсь сделать, настолько фундаментально, что должен быть простой способ его выполнить.
добавлено автор Chris, источник

2 ответы

Это возможно, но просто ... На самом деле я не знаю, как такая простая вещь может закончиться настолько смехотворно сложной.

The key to the answer can be found here: Android: keep blue background after ListView selection

Для этого нужно определить дополнительный стиль, который используется ListView , и установить режим выбора AbsListView.CHOICE_MODE_SINGLE (как объясняется в связанном ответе).

Это позволяет программно переключаться с помощью Listview.setItemChecked() . Тем не менее, вам нужно отслеживать индекс затронутого элемента в обратном вызове onItemLongClick самостоятельно, потому что ListView.setSelection() не сделает этого (не менее ListView.getSelectedItem() всегда будет возвращать -1, насколько я вижу).

Код (для простоты мой фрагмент реализует все три OnItemClickListener , OnItemLongClickListener и         <Код> ActionMode.Callback ):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    this.listViewAdapter = new ListViewAdapter();
    this.root = (ListView)inflater.inflate(R.layout.fragment_bookmarks, container, false);
    this.root.setAdapter(this.listViewAdapter);
    this.root.setOnItemClickListener(this);
    this.root.setOnItemLongClickListener(this);
    this.root.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
    return this.root;
}

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    if(this.cabMode != null)
        return false;
    this.selectedPosition = position;
    this.root.setItemChecked(position, true);

    this.root.setOnItemClickListener(null);
    this.cabMode = getActivity().startActionMode(this);
    return true;
}

И, наконец, если вы хотите избавиться от выбора, когда CAB закрыт:

@Override
public void onDestroyActionMode(ActionMode mode) {
    cabMode = null;
    this.root.setItemChecked(this.selectedPosition, false);
    this.selectedPosition = -1;
    this.root.setOnItemClickListener(this);
}

Регистрация и отмена регистрации OnItemClickListener гарантирует, что пока CAB активен, вы случайно не будете запускать действие, обычно связанное с элементом (например, открытие подробного представления).

8
добавлено
Крис, обратите внимание, что вам действительно не нужно отслеживать индекс выбранных элементов. Если в selectMode = "singleChoice", используйте AbsListView.getCheckedItemPosition (). Если в selectMode = "multipleChoice", используйте AbsListView.getCheckedItemPositions (), чтобы получить набор отмеченных элементов. (Обратите внимание, что этот метод также применим для режима одного выбора, но другой метод намного проще.
добавлено автор stormin986, источник
О, спасибо за информацию! Я был слишком зациклен на ListView.getSelectedItem() :-)
добавлено автор Chris, источник

Мое решение: (трюк)

final ListView lvMain = (ListView) activity.findViewById(R.id.listTHEMES);
lvMain.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lvMain.setItemsCanFocus(false);

ArrayAdapter adapter = new ArrayAdapter(activity,
            android.R.layout.simple_list_item_multiple_choice, ArrayTheme);
lvMain.setAdapter(adapter);
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                       int pos, long id) {
       //TODO Auto-generated method stub
        if (lvMain.isItemChecked(pos)){lvMain.setItemChecked(pos,false);}else{lvMain.setItemChecked(pos,true);}
        Log.v(LOG_TAG,"long clicked pos: " + pos);
        //lvMain.setSelection();

        return true;
    }
});
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
        //Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id);
        if (lvMain.isItemChecked(position)){lvMain.setItemChecked(position,false);}else{lvMain.setItemChecked(position,true);}

    }
});
1
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)