带有自定义ListView的Android上下文操作栏不允许多个选择

带有自定义ListView的Android上下文操作栏不允许多个选择,android,android-listview,menuitem,contextual-action-bar,android-contextmenu,Android,Android Listview,Menuitem,Contextual Action Bar,Android Contextmenu,我遵循了安卓API指南实现CAB,我有几个问题: 不存在多个选择 所选项目(行)未上色以指示它们已被选中 如何更改[A]驾驶室的颜色[B]在驾驶室上显示一些文字 当前输出为单选,不为原始颜色和动作栏的某些默认颜色着色。这是我的代码,其中MainListAdapter是自定义ListView适配器的“常规”实现,每个项都有自定义视图,dataList是简单的数据填充列表,其中包含: listview = (ListView)findViewById(R.id.listview);

我遵循了安卓API指南实现CAB,我有几个问题:

  • 不存在多个选择
  • 所选项目(行)未上色以指示它们已被选中
  • 如何更改[A]驾驶室的颜色[B]在驾驶室上显示一些文字
  • 当前输出为单选,不为原始颜色和动作栏的某些默认颜色着色。这是我的代码,其中MainListAdapter是自定义ListView适配器的“常规”实现,每个项都有自定义视图,dataList是简单的数据填充列表,其中包含:

        listview = (ListView)findViewById(R.id.listview);
        listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        listview.setMultiChoiceModeListener(new MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
                //Here you can do something when items are selected/de-selected, such as update the title in the CAB
            }
    
            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                //Respond to clicks on the actions in the CAB (contextual action bar)
                switch (item.getItemId()) {
                    case R.id.menu_delete:
                        deleteSelectedItems();
                        mode.finish();  //Action done, so close the CAB
                        return true;
                    case R.id.menu_open:
                        openSelectedItem();
                        mode.finish();  //Action done, so close the CAB
                        return true;
                    default:
                        return false;
                }
            }
    
            private void openSelectedItem() {
                // TODO Auto-generated method stub
    
            }
    
            private void deleteSelectedItems() {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                //Inflate the menu for the CAB
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.listmenu, menu);
                return true;
            }
    
            @Override
            public void onDestroyActionMode(ActionMode mode) {
                //Here you can make any necessary updates to the activity when the CAB is removed. By default, selected items are deselected/unchecked.
                //TODO refresh the list
            }
    
            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                //Here you can perform updates to the CAB due to an invalidate() request
                return false;
            }
        });
    
        listview.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) {
                //TODO open DisplayActivity
                Toast.makeText(getApplicationContext(), "Open File", Toast.LENGTH_LONG).show();
            }
        });
    
        listAdapter = new MainListAdapter(dataList, context);
        listview.setAdapter(listAdapter);
    
    listview=(listview)findViewById(R.id.listview);
    listview.setChoiceMode(listview.CHOICE\u MODE\u MULTIPLE\u MODE);
    setMultichoiceModelListener(新的MultichoiceModelListener(){
    @凌驾
    public void onItemCheckedStateChanged(ActionMode模式、int位置、长id、布尔选中){
    //在这里,您可以在选择/取消选择项目时执行某些操作,例如更新CAB中的标题
    }
    @凌驾
    公共布尔值onActionItemClicked(ActionMode模式,菜单项){
    //响应驾驶室中操作的点击(上下文操作栏)
    开关(item.getItemId()){
    案例R.id.菜单\u删除:
    删除selecteditems();
    mode.finish();//操作完成,关闭驾驶室
    返回true;
    案例R.id.菜单\打开:
    openSelectedItem();
    mode.finish();//操作完成,关闭驾驶室
    返回true;
    违约:
    返回false;
    }
    }
    私有void openSelectedItem(){
    //TODO自动生成的方法存根
    }
    私有void deleteSelectedItems(){
    //TODO自动生成的方法存根
    }
    @凌驾
    公共布尔onCreateActionMode(ActionMode模式,菜单){
    //为驾驶室菜单充气
    MenuInflater充气器=模式。getMenuInflater();
    充气机。充气(右菜单。列表菜单,菜单);
    返回true;
    }
    @凌驾
    公共void onDestroyActionMode(ActionMode模式){
    //在这里,您可以在移除CAB时对活动进行任何必要的更新。默认情况下,所选项目被取消选择/取消选中。
    //要刷新列表吗
    }
    @凌驾
    公共布尔onPrepareActionMode(操作模式,菜单){
    //在这里,您可以根据invalidate()请求对CAB执行更新
    返回false;
    }
    });
    setOnItemClickListener(新的OnItemClickListener(){
    @凌驾
    public void onItemClick(AdapterView父级、视图视图、整型位置、长rowId){
    //TODO打开显示活动
    Toast.makeText(getApplicationContext(),“打开文件”,Toast.LENGTH_LONG.show();
    }
    });
    listAdapter=新的MainListAdapter(数据列表,上下文);
    setAdapter(listAdapter);
    
    不存在多个选择

    所选项目(行)未上色以指示它们已被选中

    您可能没有为列表行设置
    激活的
    样式,该样式控制这两个行

    如何改变。。。驾驶室的颜色

    一个自定义主题应该能够做到这一点。根据您使用的是本机操作栏、早期版本的
    appcompat-v7
    还是当前版本的
    appcompat-v7
    ,规则应该有所不同。此服务器上存在大量堆栈溢出

    在驾驶室上显示一些文本

    您可以调用
    ActionMode
    上的
    setTitle()和
    setSubtitle()


    有关使用激活样式和标题/副标题的演示,请参阅。在其中,
    ListView
    处于正常模式,直到用户长按一行,在这种情况下,它将切换到多选模式操作。

    michael-请您添加输出内容以及您需要它来帮助回答的内容。@micstr谢谢,完成。