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

Привет, ребята, я хочу выделить несколько элементов в представлении списка.

Итак, я попробовал SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);, но это не помогло

Я использую пользовательский адаптер и расширяю BaseAdapter

Я использую ListView, а не AbsListView

Я не хочу использовать CAB, потому что это не очень хорошо работает с дизайном моего приложения.

Я не хочу использовать метод getView для адаптера.

Я тоже не хочу использовать флажки, я буду использовать логическое значение для каждого элемента и передать его в getviews, если я не получу решение здесь, но это не кажется слишком элегантным и аккуратным, Я считаю, что есть правильный встроенный способ сделать это, не используя getview() адаптера

Я пробовал:

android:drawSelectorOnTop="false"
android:listSelector="@android:color/darker_gray"

в xml, но он выделяет только один из элементов, и как только я нажимаю на другой элемент, он выделяет его вместо этого...

Итак, есть ли правильный способ сделать это?

Вот как выглядит мое приложение:

enter image description here

Ответ 1

SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

Этого должно быть достаточно, но вы должны использовать getView, чтобы отличать выбранное и невыбранное состояние.

Вы можете использовать isItemChecked() метод определения погоды, который выбран или нет, поэтому вам не нужно вводить логическую переменную для каждого элемента.

Edit:

Что-то вроде этого:

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

    if(list.isItemChecked(position)){
        //...
    }
    else{
        //...
    }

Ответ 2

Вы можете сделать ту же логику, что и CAB, но не использовать CAB.

Ваш элемент списка должен иметь FrameLayout в корне, например

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:foreground="?android:attr/activatedBackgroundIndicator">

....

Установите onItemClickListener для изменения режима выбора при длительном нажатии

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        if (mInMultiChoiceMode) {
            // if already in multi choice - do nothing
            return false;
        }

        mInMultiChoiceMode = true;
        // set checked selected item and enter multi selection mode
        final AbsListView list = (AbsListView) arg0;
        list.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
        list.setItemChecked(arg2, true);

        return true;
    }
});

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        if (mInMultiChoiceMode) {
            //exit multi choice mode if number of selected items is 0
            if (((AbsListView) arg0).getCheckedItemCount() == 0) {
                ((AbsListView) arg0).setChoiceMode(AbsListView.CHOICE_MODE_NONE);
                mInMultiChoiceMode = false;
            }
        } else {
            // do whatever you should as in normal non-multi item click
            System.out.println("CLICK");
        }
    }
});

Ответ 3

использование SngList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

затем вручную сделайте это в адаптере.