我正在尝试在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>
我希望有人能够帮助我!
提前谢谢!
答案 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;
}
:)