Android 在上下文操作栏可见时停止展开可展开列表视图组

Android 在上下文操作栏可见时停止展开可展开列表视图组,android,expandablelistview,android-4.4-kitkat,expandablelistadapter,Android,Expandablelistview,Android 4.4 Kitkat,Expandablelistadapter,我有一个片段,其中包含一个ExpandableListView。我想能够选择和删除项目组。我还希望能够选择删除多个组项目,通过上下文操作栏 到目前为止,我可以单击“组”查看孩子,也可以单击“孩子”转到其他活动。我将ExpandableListView的选择模式设置为choice\u mode\u MULTIPLE\u model,如果我长时间单击某个组,它就会被选中,一个上下文操作栏就会出现。如果选择“删除”按钮,则该项目将被删除。一切都好 但是,当我尝试在CAB模式下选择多个组时,问题就出现了

我有一个片段,其中包含一个
ExpandableListView
。我想能够选择和删除项目组。我还希望能够选择删除多个组项目,通过上下文操作栏

到目前为止,我可以单击“组”查看孩子,也可以单击“孩子”转到其他活动。我将
ExpandableListView
的选择模式设置为
choice\u mode\u MULTIPLE\u model
,如果我长时间单击某个组,它就会被选中,一个上下文操作栏就会出现。如果选择“删除”按钮,则该项目将被删除。一切都好

但是,当我尝试在CAB模式下选择多个组时,问题就出现了。它就是不起作用。如果单击第二个组,则该组将展开(未选中)。我希望能够突出显示多个组项目,而不发生任何扩展

有很多代码可以让它工作,但我将尝试展示一些相关的代码。主要问题是获取所选组项目的列表。其次,我不希望在选择组时对其进行扩展(当CAB可见时-这是我通过在
mActionMode
中按住ActionMode来尝试的)

非常感谢您的帮助

ex.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        @Override
        public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {
            // Ignore long clicks on children
            long pos = ex.getExpandableListPosition(position);
            if (checked && (ExpandableListView.getPackedPositionType(pos) == ExpandableListView.PACKED_POSITION_TYPE_CHILD)) {
                ex.setItemChecked(position, false);
                return;
            }
        }

        @Override
        public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
            MenuInflater inflater = actionMode.getMenuInflater();
            inflater.inflate(R.menu.context_delete_items, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
            mActionMode = actionMode;
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
            // If delete is clicked, delete the measurement set
            switch(item.getItemId()) {
                case(R.id.context_menu_delete_item):
                    Set<mySet> setsToDelete = new HashSet<mySet>();

                    if (ex != null) {
                        if (ex.getCheckedItemCount() > 0) {
                            SparseBooleanArray checkedPositions = ex.getCheckedItemPositions();
                            for (int i = 0; i < checkedPositions.size(); i++) {
                                int position = checkedPositions.keyAt(i);

                                /* Ignore selected children */
                                long pos = ex.getExpandableListPosition(position);
                                int groupPosition = ExpandableListView.getPackedPositionGroup(pos);


                                if (checkedPositions.valueAt(i)) {
                                    Log.d(TAG, "Adding MeasurementSet at position Key = " + position + " to deletion list");
                                    setsToDelete.add(mSets.get(groupPosition));
                                }

                            }
                        }
                    }

                    try {
                        if (ex != null && setsToDelete.size() > 0) {

                            ArrayList setsToDeleteList = new ArrayList(setsToDelete);
                            deleteSets(setsToDeleteList);

                            for (mySet s : setsToDelete) {
                                mSets.remove(s);
                            }

                            Toast.makeText(getActivity(), "Set deleted successfully", Toast.LENGTH_LONG).show();


                        }
                    } catch (SQLiteException sqlex) {
                        Log.e(TAG, "Delete operation failed");
                        Log.e(TAG, "Error was: " + sqlex.getMessage());
                        Log.e(TAG, "Stack trace: " + sqlex.getStackTrace());
                        Toast.makeText(getActivity(), "There was an error whilst deleting Set(s): " + sqlex.getMessage(), Toast.LENGTH_LONG).show();
                    }

                    actionMode.finish();
                    return true;
                default:
                    return false;
            }
        }

        @Override
        public void onDestroyActionMode(ActionMode actionMode) {
            mActionMode = null;
        }
    });

    ex.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
            Long mId = mSets.get(groupPosition).getMyList().get(childPosition).getId();
            Intent intent = new Intent(getActivity(), ViewSingleActivity.class);
            intent.putExtra(getResources().getString(R.string.EXTRA_MID_KEY), measurementId);
            startActivityForResult(intent, Constants.REQ_VIEW_M);
            return true;
        }
    });

// Here I was trying to intercept group clicks and force the clicked group to collapse. Although this doesn't seem to solve the issue of having the group "selected"
    ex.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            if (mActionMode != null) {
                Log.d(TAG, "mActionMode is not null. Setting View: " + parent.toString() + " to be selected");
                v.setSelected(true);
                Log.d(TAG, "Collapsing group " + groupPosition);
                parent.collapseGroup(groupPosition);
            }
            return false;
        }
    });
}
ex.setMultichoiceModelListener(新的AbsListView.MultichoiceModelListener(){
@凌驾
public void onItemCheckedStateChanged(ActionMode ActionMode,int位置,长id,布尔值已选中){
//忽略长时间点击儿童
长位置=例如getExpandableListPosition(位置);
如果(选中&(ExpandableListView.getPackedPositionType(pos)==ExpandableListView.PACKED\U POSITION\U TYPE\U CHILD)){
ex.setItemChecked(位置,假);
返回;
}
}
@凌驾
公共布尔onCreateActionMode(ActionMode ActionMode,菜单){
MenuInflater充气器=动作模式。getMenuInflater();
充气机。充气(右菜单。上下文删除项目,菜单);
返回true;
}
@凌驾
公共布尔onPrepareActionMode(ActionMode ActionMode,菜单){
mActionMode=actionMode;
返回false;
}
@凌驾
公共布尔值onActionItemClicked(ActionMode ActionMode,MenuItem项){
//如果单击“删除”,则删除测量集
开关(item.getItemId()){
案例(R.id.context\u菜单\u删除\u项):
Set setToDelete=new HashSet();
如果(ex!=null){
如果(例如getCheckedItemCount()>0){
SparseBooleanArray checkedPositions=ex.GetCheckEditePositions();
对于(int i=0;i0){
ArrayList SetToDeleteList=新的ArrayList(SetToDelete);
deleteSets(setToDeletList);
for(mySet s:setToDelete){
mSets.移除(s);
}
Toast.makeText(getActivity(),“Set deleted successfully”,Toast.LENGTH_LONG.show();
}
}捕获(SQLiteException sqlex){
Log.e(标记“删除操作失败”);
Log.e(标记“Error was:”+sqlex.getMessage());
Log.e(标记,“堆栈跟踪:+sqlex.getStackTrace());
Toast.makeText(getActivity(),“删除集合时出错:”+sqlex.getMessage(),Toast.LENGTH_LONG).show();
}
actionMode.finish();
返回true;
违约:
返回false;
}
}
@凌驾
公共void onDestroyActionMode(ActionMode ActionMode){
mActionMode=null;
}
});
ex.setOnChildClickListener(新的ExpandableListView.OnChildClickListener(){
@凌驾
公共布尔onChildClick(ExpandableListView父视图、视图v、int-groupPosition、int-childPosition、长id){
Long mId=mSets.get(groupPosition.getMyList().get(childPosition.getId());
Intent Intent=new Intent(getActivity(),ViewSingleActivity.class);
intent.putExtra(getResources().getString(R.string.EXTRA\u MID\u KEY),measurementId);
startActivityForResult(意图、常量、请求和视图);
返回true;
}
});
//在这里,我试图拦截群点击,并迫使点击的群崩溃。虽然这似乎无法解决“选择”组的问题
例如,setOnGroupClickListener(新的ExpandableListView.OnGroupClickListener(){
@凌驾
公共布尔onGroupClick(ExpandableListView父视图、视图v、int-groupPosition、长id){
if(mActionMode!=null){
Log.d(标记“mActionMode不为null。设置视图:”+parent.toString()+“待选择”);
v、 设定值