Android 如何使动作模式与ListView一起工作

Android 如何使动作模式与ListView一起工作,android,listview,android-inflate,action-menu,Android,Listview,Android Inflate,Action Menu,我正在尝试使用操作模式获取上下文菜单,在该模式下,我可以通过长时间单击列表视图中的项目来选择它。我根据创建了一个MultiChoiceListener,并制作了一个ItemLongClickListener,它将一个项目设置为选中状态,这是操作模式工作所需的 我的问题是,即使长时间单击的项目正在播放动画,动作菜单也不会膨胀 列表视图代码: final ListView listView = (ListView) findViewById(android.R.id.list); l

我正在尝试使用操作模式获取上下文菜单,在该模式下,我可以通过长时间单击列表视图中的项目来选择它。我根据创建了一个MultiChoiceListener,并制作了一个ItemLongClickListener,它将一个项目设置为选中状态,这是操作模式工作所需的

我的问题是,即使长时间单击的项目正在播放动画,动作菜单也不会膨胀

列表视图代码:

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

            }
        });

提前谢谢

我在那里没有看到任何实际启动动作模式的代码。这是您的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);
  }
可以在以下站点找到使用类似操作模式手动演示的完整示例项目:


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

我在其中没有看到任何实际启动动作模式的代码。这是您的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);
  }
可以在以下站点找到使用类似操作模式手动演示的完整示例项目:


注意,这个项目演示了如何通过ActionBarSherlock使用动作模式。

Commonware的答案很好。如果您想要的是通过长时间单击选择一个元素的MultiChoiceModelListener,那么以下代码可能会帮助您:

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或任何其他您喜欢的选项。

Commonware的答案非常好。如果您想要的是通过长时间单击选择一个元素的MultiChoiceModelListener,那么以下代码可能会帮助您:

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或任何其他您喜欢的选项。

在谷歌示例中,没有单独的类处理ActionMode。我需要创建一个单独的类来使用它吗?@BlueHazard:这取决于你。您需要一些实现ActionMode.Callback的东西,以便与startActionMode一起使用。我选择把它委托给一个单独的班级。如果你想让你的活动实现ActionMode.Callback,那应该很好。为什么不实现MultichoiceModelListener并使用onCreateActionMode呢?@nurettin:OP可以。这是不够的。谷歌的例子中没有单独的类来处理ActionMode。我需要创建一个单独的类来使用它吗?@BlueHazard:这取决于你。您需要一些实现ActionMode.Callback的东西,以便与startActionMode一起使用。我选择把它委托给一个单独的班级。如果你想让你的活动实现ActionMode.Callback,那应该很好。为什么不实现MultichoiceModelListener并使用onCreateActionMode呢?@nurettin:OP可以。这是不够的。