从Contextual Action Bar访问ListView项目的文本

时间:2012-03-22 23:13:02

标签: android android-listview android-menu android-actionbar

我需要通过长按选择来访问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,因为这显然是针对上下文菜单而不是操作栏。也许对于Action吧有一些相同的东西吗?或者,在这种情况下如何获取ListView项目文本?感谢。

2 个答案:

答案 0 :(得分:11)

getCheckedItemPositions()上的

ListView将返回用户已检查的商品位置,如果您使用的是getCheckedItemIds(),则CursorAdapter将返回其ID值。

Here is a sample project演示了在API级别11+上使用CHOICE_MODE_MULTIPLE_MODAL并回退到旧设备上下文菜单。

答案 1 :(得分:1)

我尝试在getCheckedItemIds()对象上使用ListView方法,但它没有返回任何内容(我没有使用Cursor对象)。事实证明这是人们一直面临的常见问题。所以我想出了一个解决方法。在我的情况下,我不得不使用项目ID来创建通知(只是尝试一些示例代码)所以这就是我做的事情:

我创建了一个ArrayList来存储所有已选择项目的ID。每次检查项目时,都会调用onItemCheckedStateChanged(..)方法。我们可以使用此方法根据状态更改更新ID的ArrayList。然后,当用户选择一个选项并调用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();
                        }
                    }
                }
            }
        });