1

我需要通过长按选择访问 ListView 项目中的文本。对于旧的 Android 版本,我已经使用下面的代码使用上下文菜单成功地做到了这一点。

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    String text = ((TextView) info.targetView).getText().toString();

    switch (item.getItemId()) {
        case R.id.getText:
            getText(text);
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

但是,对于较新的 Android 版本,我想使用上下文操作栏执行此操作,但在选择栏中的项目后无法弄清楚如何提取选定的文本。下面的代码不起作用。

    myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    myListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        String text = ((TextView) info.targetView).getText().toString();

            switch (item.getItemId()) {
                case R.id.contextDelete:
                    getText(text);
                    return true;;
                default:
                    return false;
            }
        }

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

        //Other actionmode methods...
    });

上下文操作栏显示正常,但是当从中选择一个项目时,我在 AdapterContextMenuInfo 行收到 NullPointerException,因为这显然是为上下文菜单而不是操作栏制作的。也许对于动作栏有一些等价物吗?或者在这种情况下如何获取 ListView 项目文本?谢谢。

4

2 回答 2

11

getCheckedItemPositions()onListView将返回用户检查过的项目位置,getCheckedItemIds()如果您使用类似CursorAdapter.

这是一个示例项目,演示了CHOICE_MODE_MULTIPLE_MODAL在 API 级别 11+ 上的使用以及回退到旧设备上的上下文菜单。

于 2012-03-22T23:22:11.970 回答
1

我尝试getCheckedItemIds()在对象上使用该方法,ListView但它什么也没返回(我没有使用Cursor对象)。事实证明,这是人们一直面临的普遍问题。所以我想出了一个解决方法。在我的情况下,我必须使用项目 ID 来创建通知(只是尝试一些示例代码),所以这就是我为获取它们所做的:

我创建了一个ArrayList来存储所有已选择项目的 ID。每次检查项目时,onItemCheckedStateChanged(..)都会调用该方法。我们可以使用此方法ArrayList根据状态更改更新 ID。onActionItemClicked()然后当用户选择一个选项并调用该方法时,我们可以使用存储在此列表中的 ID 。这是代码:

lv.setMultiChoiceModeListener(new MultiChoiceModeListener() {
            private ArrayList<Long> checkedIds = new ArrayList<Long>();

                    //Code omitted for brevity

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                menu.add(0, 1, 0, R.string.context_create_notification);
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                switch(item.getItemId()){
                case 1:
                    for(long id : checkedIds){
                        createNotification(id+1);
                    }
                    mode.finish();
                    break;
                }
                return true;
            }

            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position,
                    long id, boolean checked) {

                if(checked){
                    checkedIds.add(id);
                } else{
                    Iterator<Long> iter = checkedIds.iterator();
                    while(iter.hasNext()){
                        long stored = (Long) iter.next();
                        if(stored == id){
                            iter.remove();
                        }
                    }
                }
            }
        });
于 2012-05-04T07:04:28.903 回答