从所选的Listview项目设置上下文菜单的标题

5

如何从选择的Listview项设置上下文菜单的标题?以下是我的主要活动

public class OListActivity extends ListActivity {
......
......
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        registerForContextMenu(getListView());
        ......
......
        MatrixCursor cursor;
        cursor = NameManager.getnameList();
        startManagingCursor(cursor);
        String[] from = { "name", "info", "status", BaseColumns._ID };
        int[] to = { R.id.name, R.id.info, R.id.status };
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                R.layout.row, cursor, from, to);
        setListAdapter(adapter);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Menu");// TODO Change to name of selected listview item.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
    }
.....
.....

我需要将menu.setHeaderTitle设置为R.id.name。我知道有另一个类似的问题,但它没有提及如何处理具有多个文本视图的复杂ListView
2个回答

14
使用onCreateContextMenu()方法中的ContextMenuInfo参数:
@Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        AdapterView.AdapterContextMenuInfo info;
        try {
            // Casts the incoming data object into the type for AdapterView objects.
            info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        } catch (ClassCastException e) {
            // If the menu object can't be cast, logs an error.
            Log.e(TAG, "bad menuInfo", e);
            return;
        }
        Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
        if (cursor == null) {
            // For some reason the requested item isn't available, do nothing
            return;
        }

        // if your column name is "name"
        menu.setHeaderTitle(cursor.getString(cursor.getColumnIndex("name")));
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
    }

好的,非常感谢。顺便说一下,我不得不改成 menu.setHeaderTitle(cursor.getString(1)) - Binoy Babu
@BinoyBabu,你说得对,getString() 方法需要一个 int 而不是一个 String。我很累了,我一直在想到方法 cursor.getString(cursor.getColumnIndex("name")); - user
不用担心,无论如何你都是我的英雄。好好休息一下,行吗? - Binoy Babu

0

我知道这是一个相当古老的帖子,也是正确的答案。然而,今天在使用它时,我遇到了一些我想要添加的内容。

ContextMenuInfo参数用于查找启动ContextMenu即我们的适配器项的确切位置。

因此,它可以使用该位置info.position返回Adapter的getItem()方法中定义的类型的项,如上所述,getItem()方法返回一个Cursor对象。

(在我的情况下,它返回了一个Model类,然后我意识到,要通过menu.setHeaderTitle()设置标题,我可以传递我的模型支持的方法,如model.getItamName()

此外,请记住,如果您的AdapterView包含任何标题,则在使用menuInfo获取位置时必须将它们排除在外。例如:

Cursor cursor = (Cursor) getListAdapter().getItem(info.position - yourList.getHeaderViewsCount());

希望这能帮助到某个人。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接