【问题标题】:How to get Action Mode working with a ListView如何让动作模式与 ListView 一起工作
【发布时间】:2012-10-17 14:41:31
【问题描述】:

我正在尝试使用操作模式获取上下文菜单,我可以通过长按在 ListView 中选择一个项目。我根据this reference 创建了一个 MultiChoiceListener 并创建了一个 ItemLongClickListener ,它将一个项目设置为选中,这是根据this reference 操作模式工作所必需的。

我的问题是,即使项目长按动画正在播放,ActionMenu 也不会膨胀。

列表查看代码:

final ListView listView = (ListView) findViewById(android.R.id.list);
        listView.setAdapter(adapter);
        listView.setLongClickable(true);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long id) {

            Cursor cursor = db.getSubject(id);
            String subject = null;
            try {
                subject = cursor.getString(cursor.getColumnIndex("subject"));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Intent intent = new Intent(Main.this, Marks.class);
            intent.putExtra("selected", subject);
            startActivity(intent);
            }
        });
        listView.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                listView.setItemChecked(arg2, true);
                return true;
            }

        });

        listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

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

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position,
                    long id, boolean checked) {
                // TODO Auto-generated method stub

            }
        });

提前致谢!

【问题讨论】:

    标签: android listview android-inflate action-menu


    【解决方案1】:

    我没有看到任何代码来实际启动动作模式。这是您的OnItemLongClickListener 需要做的事情,例如:

      @Override
      public boolean onItemLongClick(AdapterView<?> view, View row,
                                     int position, long id) {
        modeView.clearChoices();
        modeView.setItemChecked(position, true);
    
        if (activeMode == null) {
          activeMode=host.startActionMode(this);
        }
    
        return(true);
      }
    

    可以在以下位置找到使用此类操作模式手动演示的完整示例项目:https://github.com/commonsguy/cw-omnibus/tree/master/ActionMode/Manual

    请注意,该项目演示了通过 ActionBarSherlock 使用动作模式。

    【讨论】:

    • Google 示例中没有单独的类处理 ActionMode。我需要创建一个单独的类来使用它吗?
    • @BlueHazard:这取决于你。您需要实现ActionMode.Callback 的东西以与startActionMode() 一起使用。我选择将其委托给一个单独的班级。如果你想让你的活动实现ActionMode.Callback,那应该很好。
    • 为什么不实现MultiChoiceModeListener并使用onCreateActionMode
    • @nurettin:OP 确实如此。这还不够。
    【解决方案2】:

    CommonsWare 的回答很棒。如果您想要的是通过长按来选择一个元素的 MultiChoiceModeListener,此代码可能会对您有所帮助:

    public class MyFragment extends Fragment implements MultiChoiceModeListener{
        private ListView mListView;
        // ...
    
        public void onViewCreated(View view, Bundle savedInstanceState) {
            mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
            mListView.setMultiChoiceModeListener(this);
    
            mListView.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {                
                    mListView.setItemChecked(arg2, true);
                }
            });
        }
    

    在我的情况下,我只需单击一下即可,但您可以将 OnItemClickListener 更改为 OnItemLongClickListener 或您喜欢的任何其他内容。

    【讨论】:

      猜你喜欢
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 2020-12-13
      相关资源
      最近更新 更多