Выбор нескольких элементов в 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() будет вызван для слушателя выбора режима).

Другие вопросы по тегам