【问题标题】:How do I use a selectable list with a contextual actionbar?如何使用带有上下文操作栏的可选列表?
【发布时间】:2013-07-31 12:56:59
【问题描述】:

我在这里阅读了新的 Android 设计标准:http://developer.android.com/design/patterns/selection.html,并且首先想知道如何使我的 ListView 可选择(因为现在应该长按来选择项目,而不是像以前那样显示上下文菜单),然后弄清楚如何将该信息传递给 ActionBar,以便我可以根据选择的内容(以及选择的项目数量)制作上下文 ActionBar。我查看了几个站点,包括 http://www.vogella.de/articles/AndroidListView/article.html,但它没有显示如何使用 ActionBar 为 ICS 执行此操作。

我很抱歉没有提供任何代码,但除了制作自定义列表视图之外,我不需要对列表视图做任何事情。

【问题讨论】:

    标签: android


    【解决方案1】:

    对于第一部分(选择列表项),您需要做几件事:

    -根据上下文,使用 setChoiceMode 方法将 ListView 设置为单选或多选(取决于您的应用)。

    lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    // or
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    

    -为了将item标记为选中,只需长按并调用ListView的setItemChecked方法即可。

    lv.setItemChecked(position, true);
    

    最后,为了使列表视图项显示为选中状态,您需要将以下属性添加到该列表视图项的自定义 XML 布局中:
    android:background="?android:attr/activatedBackgroundIndicator"

    对于创建上下文操作栏,该过程更详细一些,但它在 Android 开发人员指南的Using Contextual Action Mode 部分中进行了概述。

    【讨论】:

    • 谢谢!我一直在寻找这样的答案一段时间
    • 我正在做同样的事情,只是我使用了一个复选框,并且当我调用 setItemChecked 时它取消选中该复选框?有什么提示吗?
    • 在 3.0 之前的设备上尝试扩展包含 android:background="?android:attr/activatedBackgroundIndicator" 的布局时应用程序崩溃(无论如何您都不需要这个)。我的解决方案是在运行时为 3.0 之前的设备选择不同的布局: if (Build.VERSION.SDK_INT
    【解决方案2】:

    我的建议是创建一个实现ActionMode.Callback 接口的类。您可以在初始化时为其提供与单击的视图相关联的 id 或数据,我相信如果用户更改所选视图等,您可以制定方法来更改它。这是我使用的基本方法:

    public class UserABMode implements ActionMode.Callback {
    
        private long mId;
        private String mEquation;
    
        public UserABMode(long id, String equation) {
            super();
            mId = id;
            mEquation = equation;
        }
    
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.customcontext, menu);
            return true;
        }
    
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            // don't need to do anything
            return false;
        }
    
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            //do stuff with mId or mEquation
            return true;
        }
    
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mMode = null;
        }
    
    }
    

    【讨论】:

    • 如果我使用这种方法(我正在使用复选框)复选框会很好地显示上下文操作栏,但是当我取消选中它时,如何删除上下文操作栏?
    • 我想通了... actionMode.finished();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多