在android中使用带有listview的contextmenu

mun*_* pk 33 android listview contextmenu

我正在开发一个android应用程序.我将有一个listview,并且我设置了一个上下文菜单,当listview项目被长按时出现.如何从列表视图项目中选择项目(比如listview textview中的文本)选择了一个来自contextmenu的动作,我可以处理它吗?这是一些代码:

protected void onCreate(Bundle savedInstanceState) {
    -------
    lv1 = (ListView) findViewById(R.id.listings);

    registerForContextMenu(lv1);
    lv1.setOnItemClickListener(this);

}
Run Code Online (Sandbox Code Playgroud)

和onCreateContextMenu:

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();
    switch (item.getItemId()) {
    case R.id.watch:
        String name = "";
        return true;
    case R.id.buy:
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想从列表项中的textview获取文本.我如何实现这一目标?

Piy*_*ush 69

你应该注册LISTVIEW上下文菜单.

这是源头.

用于onCreate():

 registerForContextMenu(lv);
Run Code Online (Sandbox Code Playgroud)

并且在长按期间访问所选项目:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
   if (v.getId() == R.id.lv) {
       ListView lv = (ListView) v;
       AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
       YourObject obj = (YourObject) lv.getItemAtPosition(acmi.position);

       menu.add("One");
       menu.add("Two");
       menu.add("Three");
       menu.add(obj.name);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • Piyush Gupta我真的很感谢你的帮助.你不知道你有多少帮助过我.我欠你很多人.我真的遇到了麻烦,在发布这篇文章之前花了我一个星期.我非常感激.谢谢. (14认同)

Kam*_*ryn 33

要从所选的ListView项中获取项,请参阅ContextMenuInfo对象(请参阅下面的上一个实现方法).完整解决方案如下:

1)在ListActivity类中为上下文菜单注册ListView

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    getListView().setAdapter(mAdapter);
    registerForContextMenu(getListView());
}
Run Code Online (Sandbox Code Playgroud)

1a)如果您的列表中有复杂的View,则可能需要长度单击Adapter类中的每个列表视图

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        RelativeLayout layout = (RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
        itemLayout = layout;
        itemLayout.setLongClickable(true);
    }
    // ...
    return view;
}
Run Code Online (Sandbox Code Playgroud)

2)在ListActivity类中实现onCreateContextMenu()和onContextItemSelected()

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
    String title = ((MyItem) mAdapter.getItem(info.position)).getTitle();
    menu.setHeaderTitle(title);

    menu.add(Menu.NONE, MENU_CONTEXT_DELETE_ID, Menu.NONE, DELETE_TEXT);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case MENU_CONTEXT_DELETE_ID:
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        Log.d(TAG, "removing item pos=" + info.position);
        mAdapter.remove(info.position);
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 制作**longclickable = true**是救生员.感谢名单. (2认同)

twi*_*wig 5

问题在于onItemLongClick()方法,不要将其用于上下文菜单。

相反,为上下文菜单注册 LISTVIEW。

这是来源。

对于 onCreate():

registerForContextMenu(lv);
Run Code Online (Sandbox Code Playgroud)

并在长按期间访问所选项目:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    if (v.getId() == R.id.lv) {
        ListView lv = (ListView) v;
        AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
        YourObject obj = (YourObject) lv.getItemAtPosition(acmi.position);

        menu.add("One");
        menu.add("Two");
        menu.add("Three");
        menu.add(obj.name);
    }
}
Run Code Online (Sandbox Code Playgroud)