在具有自定义视图的Android ListView中选择多个项目

时间:2014-06-06 21:59:59

标签: android android-listview multipleselection android-actionmode

我正在尝试在Android应用程序中实现Android ListView中的多个项目选择,以允许用户在动作模式的帮助下在一个动作中删除多个行。

例如,我检查听取长按的第一项(在以下示例中,contactsListView):

@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 个答案:

答案 0 :(得分:0)

您无需手动拨打setItemChecked()

只需使用

设置ListView(之前的版本)
contacts.setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL);
contacts.setMultiChoiceModeListener(new MultiChoiceModeListener() { ... });

当你长按一个项目时,它会被自动检查(并且将为选择模式监听器调用onCreateActionMode()。)

答案 1 :(得分:0)

我终于找到了解决方案。

原始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;
  }

:)