当我使用longClick时,我想添加一个带有2个按钮的对话框,进行编辑和删除(仅实际删除实现)(标准单击会打开项目详细信息)

所以我尝试遵循this link上的指南

并且我添加了

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.layout.edit_dialog, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();

    switch (item.getItemId()) {
    case R.id.remove_item:

        final String[] listItem = getItemId();

        String idItemSel = listItem[info.position];

        delItem(idItemSel);
        adapter.notifyDataSetChanged();
        return true;
    }
    return false;
}


(其中适配器是我的列表适配器)

我已经以这种方式配置了监听器

list.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                .....

            }
        });


        list.setOnItemLongClickListener(new OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> parent, View view,
                    int position, long id) {
                view.showContextMenu();
                return true;

            }
        });


一切正常,但是当我长时间单击时,出现此错误(调用view.showContextMenu();)时应用崩溃:

08-02 18:13:12.079: E/AndroidRuntime(7780): FATAL EXCEPTION: main
08-02 18:13:12.079: E/AndroidRuntime(7780): java.lang.StackOverflowError
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1995)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onItemLongClick(MyItems.java:615)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:2001)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at android.view.View.showContextMenu(View.java:2520)
08-02 18:13:12.079: E/AndroidRuntime(7780):     at detailer.myapp.it.MyItems$6.onIt


长按列表项时,该问题有什么解决方案或查看简单上下文对话框的替代方法?

最佳答案

您似乎已经为ContextMenu注册了ListView并设置了一个调用showContextMenu()的OnItemLongClickListener,这将创建一个循环逻辑:


OnItemLongClickListener调用ContextMenu,
ContextMenu调用OnItemLongClickListener,
OnItemLongClickListener调用ContextMenu,
ContextMenu调用OnItemLongClickListener,
等等直到堆栈溢出


要解决此问题:

首先,删除OnItemLongClickListener,因为它与ContextMenu无关。

其次,仔细检查您如何使用ContextMenu。您已经将菜单保存在布局文件夹中,并且如果您已经使用过registerForContextMenu(),则无需调用showContextMenu()。



要设置ContextMenu,只需将整个ListView传递给registerForContextMenu():

registerForContextMenu(list);


您将需要这样的XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/edit"
        android:title="@string/edit" />
    <item
        android:id="@+id/remove"
        android:title="@string/remove" />
</menu>


将此保存到新文件夹res/menu中,我将其命名为context_menu.xml。

然后更改您的方法以创建ContextMenu:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    getMenuInflater().inflate(R.menu.context_menu, menu);
}


现在,长按一次,每行将自动打开一个ContextMenu。



如果需要有关编辑和删除行的帮助,请发布用于创建ListView和适配器的代码。

关于android - 尝试在长按列表项时单击以添加对话框,导致StackOverflow错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11781692/

10-12 00:11
查看更多