我试图在我的自定义 ExpandableListView
中实现多项选择,这里是 Java 代码和组布局:
Java
mExpandable.setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE_MODAL);
mExpandable.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {
if(DEBUG) Log.i("mFragmentList","onItemCheckedStateChanged()");
if(mExpandable.getCheckedItemCount() == 0)
actionMode.setSubtitle("Check some items!");
else if(mExpandable.getCheckedItemCount() == 1)
actionMode.setSubtitle("1 item selected");
else
actionMode.setSubtitle(mExpandable.getCheckedItemCount() + " items selected");
}
@Override
public boolean onCreateActionMode(ActionMode actionMode, android.view.Menu menu) {
actionMode.setTitle("Select Items");
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, android.view.Menu menu) {
return true;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
return true;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
});
group_row.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/activated">
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:scaleType="center"
android:layout_centerVertical="true"
android:adjustViewBounds="true"
android:layout_gravity="left"
android:src="@drawable/ball" />
<TextView
android:id="@+id/tvGroupName"
android:paddingLeft="35dp"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFF0000"
android:textSize="17sp" />
</RelativeLayout>
当我长按一个项目时,该项目被选中并创建
ActionMode
但如果我想选择另一个项目,该项目将被展开并且 onItemCheckedStateChanged()
不再被调用,因此我不能选择多个项目。我试图将 CHOICE_MODE_MULTIPLE_MODAL
放在 XML 中,但我什至无法选择一项。我错过了什么?这是一个屏幕截图: 最佳答案
好的,我终于用一种解决方法解决了它。
mExpandable.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
if(actionModeEnabled)
expandableListView.setItemChecked(i, !expandableListView.isItemChecked(i));
return actionModeEnabled;
}
});
mExpandable.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {
if(mExpandable.getCheckedItemCount() == 1)
actionMode.setSubtitle("1 item selected");
else
actionMode.setSubtitle(mExpandable.getCheckedItemCount() + " items selected");
}
@Override
public boolean onCreateActionMode(ActionMode actionMode, android.view.Menu menu) {
actionModeEnabled = true;
actionMode.setTitle("Select Items");
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, android.view.Menu menu) {
return true;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
return true;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
actionModeEnabled = false;
}
});
因此,当我长按某个项目时,会启用操作模式,并按预期检查第一项。为了继续选择项目,我设置了一个
OnGroupClickListener
,所以现在当我点击一个项目时,我使用 setItemChecked()
选择/取消选择它,并在启用操作模式时返回 true
以便列表不会被扩展,只是被选中。关于android - onItemCheckedStateChanged() 在自定义 ExpandableListView 上只调用一次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21344605/