Как выделить несколько элементов в виде списка?
Привет, ребята, я хочу выделить несколько элементов в представлении списка.
Итак, я попробовал 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);
затем вручную сделайте это в адаптере.