我试图在我的自定义 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/

10-11 16:25