Выбор нескольких элементов в Android ListView с настраиваемым представлением
Я пытаюсь реализовать в приложении Android выбор нескольких элементов в Android ListView
чтобы позволить пользователю удалить несколько строк в одном действии с помощью режима действия.
Например, я проверяю первый элемент, прослушивая длинный щелчок (в следующем примере contacts
это ListView
):
@override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
{
contacts.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contacts.setItemChecked(position, true);
return true;
}
Дело в том, что после вызова setItemChecked()
метод, getCheckedItemPositions()
возврат метода null
но он должен вернуть положение элемента, который был проверен в onItemLongClick()
метод нет?
Предметы моего ListView
сделаны с пользовательским видом. Так что я прочитал по всему интернету, что мой собственный взгляд должен реализовать Checkable
интерфейс. Итак, вот основной контейнер моего пользовательского представления:
public final class CheckableLinearLayout
extends LinearLayout
implements Checkable
{
private boolean checked;
public CheckableLinearLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
public boolean isChecked()
{
return checked;
}
@Override
public void setChecked(boolean checked)
{
this.checked = checked;
}
@Override
public void toggle()
{
checked = !checked;
}
}
а вот макет элемента:
<?xml version="1.0" encoding="utf-8"?>
<com.package.CheckableLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dip"
android:background="@drawable/bg_contact"
>
<ImageView
android:id="@+id/contactPhoto"
android:layout_width="75dip"
android:layout_height="75dip"
/>
<TextView
android:id="@+id/contactName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_gravity="center_vertical"
android:textColor="@color/black"
/>
</com.package.CheckableLinearLayout>
Я надеюсь, что кто-то сможет мне помочь!
Заранее спасибо!
2 ответа
Я наконец нашел решение.
Оригинал onItemLongClick
метод это один:
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
{
if (actionMode != null)
{
return false;
}
contacts.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contacts.setItemChecked(position, true);
getActionBarActivity().startSupportActionMode(new ActionModeCallback());
return true;
}
И я назвал getCheckedItemPositions()
метод в метод моего класса действия режима.
Если я переписываю предыдущий метод положить getActionBarActivity().startSupportActionMode(new ActionModeCallback());
перед установкой режима выбора вроде бы работает:)
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
{
if (actionMode != null)
{
return false;
}
getActionBarActivity().startSupportActionMode(new ActionModeCallback());
contacts.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
contacts.setItemChecked(position, true);
return true;
}
:)
Вам не нужно звонить setItemChecked()
вручную.
Просто настройте ListView (ранее) с помощью
contacts.setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL);
contacts.setMultiChoiceModeListener(new MultiChoiceModeListener() { ... });
И когда вы долго нажимаете на элемент, он будет проверен автоматически (и onCreateActionMode()
будет вызван для слушателя выбора режима).