Java Android:Listview长挂上下文菜单问题

Java Android:Listview长挂上下文菜单问题,java,android,listview,contextmenu,Java,Android,Listview,Contextmenu,在长时间按住listview条目并显示各种选项后,我试图打开上下文菜单。 但是,我不能,因为holding没有做/调用任何事情 这是我用来调用上下文菜单的代码: @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuItem d

在长时间按住listview条目并显示各种选项后,我试图打开上下文菜单。 但是,我不能,因为holding没有做/调用任何事情

这是我用来调用上下文菜单的代码:

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

    MenuItem delete = menu.add("delete");
    MenuItem edit = menu.add("edit");
    delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            return true;
        }
    });
    edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            return true;
        }
    });
}
@Override
public void onCreateContextMenu(ContextMenu menu, 
                View v, ContextMenuInfo menuInfo) {
    menu.add(0, 1, 0, "Edit");
    menu.add(0, 2, 1, "Rename");
    menu.add(0, 3, 2, "Delete");
    super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    super.onContextItemSelected(item);

    if(item.getTitle().equals("Edit")) {
        //Edit code
    } else if(item.getTitle().equals("Rename")) {
        //Rename code
    } else if(item.getTitle().equals("Delete")) {
        //Delete code
    }
    return true;
};
public class MainActivity extends Activity {
    private List<CountElement> myElements = new ArrayList<CountElement>();
    ListView list;
    ArrayAdapter<CountElement> adapter;

    /*
    Users enters needed listview items, code not shown here. It works fine however - 
    all needed elements are displayed correctly.
    */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new MyListAdapter();
        list = (ListView) findViewById(R.id.listView1);
        list.setAdapter(adapter);
        registerForContextMenu(list);
    }

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

        MenuItem delete = menu.add("delete");
        MenuItem edit = menu.add("edit");
        delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                return true;
            }
        });
        edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                return true;
            }
        });
    }

    private class MyListAdapter extends ArrayAdapter<CountElement> {
        //Custom adapter code here
    }
}
我也试过,但也没有用:

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

    MenuItem delete = menu.add("delete");
    MenuItem edit = menu.add("edit");
    delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            return true;
        }
    });
    edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            return true;
        }
    });
}
@Override
public void onCreateContextMenu(ContextMenu menu, 
                View v, ContextMenuInfo menuInfo) {
    menu.add(0, 1, 0, "Edit");
    menu.add(0, 2, 1, "Rename");
    menu.add(0, 3, 2, "Delete");
    super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    super.onContextItemSelected(item);

    if(item.getTitle().equals("Edit")) {
        //Edit code
    } else if(item.getTitle().equals("Rename")) {
        //Rename code
    } else if(item.getTitle().equals("Delete")) {
        //Delete code
    }
    return true;
};
public class MainActivity extends Activity {
    private List<CountElement> myElements = new ArrayList<CountElement>();
    ListView list;
    ArrayAdapter<CountElement> adapter;

    /*
    Users enters needed listview items, code not shown here. It works fine however - 
    all needed elements are displayed correctly.
    */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new MyListAdapter();
        list = (ListView) findViewById(R.id.listView1);
        list.setAdapter(adapter);
        registerForContextMenu(list);
    }

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

        MenuItem delete = menu.add("delete");
        MenuItem edit = menu.add("edit");
        delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                return true;
            }
        });
        edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                return true;
            }
        });
    }

    private class MyListAdapter extends ArrayAdapter<CountElement> {
        //Custom adapter code here
    }
}
main活动代码(仅相关部分):

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

    MenuItem delete = menu.add("delete");
    MenuItem edit = menu.add("edit");
    delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            return true;
        }
    });
    edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            return true;
        }
    });
}
@Override
public void onCreateContextMenu(ContextMenu menu, 
                View v, ContextMenuInfo menuInfo) {
    menu.add(0, 1, 0, "Edit");
    menu.add(0, 2, 1, "Rename");
    menu.add(0, 3, 2, "Delete");
    super.onCreateContextMenu(menu, v, menuInfo);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    super.onContextItemSelected(item);

    if(item.getTitle().equals("Edit")) {
        //Edit code
    } else if(item.getTitle().equals("Rename")) {
        //Rename code
    } else if(item.getTitle().equals("Delete")) {
        //Delete code
    }
    return true;
};
public class MainActivity extends Activity {
    private List<CountElement> myElements = new ArrayList<CountElement>();
    ListView list;
    ArrayAdapter<CountElement> adapter;

    /*
    Users enters needed listview items, code not shown here. It works fine however - 
    all needed elements are displayed correctly.
    */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new MyListAdapter();
        list = (ListView) findViewById(R.id.listView1);
        list.setAdapter(adapter);
        registerForContextMenu(list);
    }

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

        MenuItem delete = menu.add("delete");
        MenuItem edit = menu.add("edit");
        delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                return true;
            }
        });
        edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {
                return true;
            }
        });
    }

    private class MyListAdapter extends ArrayAdapter<CountElement> {
        //Custom adapter code here
    }
}
公共类MainActivity扩展活动{
private List myElements=new ArrayList();
列表视图列表;
阵列适配器;
/*
用户输入所需的listview项,此处未显示代码。它工作正常,但-
所有需要的元素都正确显示。
*/
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
适配器=新的MyListAdapter();
列表=(ListView)findViewById(R.id.listView1);
list.setAdapter(适配器);
registerForContextMenu(列表);
}
@凌驾
public void onCreateContextMenu(ContextMenu,视图v,
上下文菜单信息(menuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
MenuItem delete=菜单。添加(“删除”);
MenuItem edit=菜单。添加(“编辑”);
delete.setOnMenuItemClickListener(新的OnMenuItemClickListener(){
公共布尔onMenuItemClick(菜单项){
返回true;
}
});
edit.setOnMenuItemClickListener(新的OnMenuItemClickListener(){
公共布尔onMenuItemClick(菜单项){
返回true;
}
});
}
私有类MyListAdapter扩展了ArrayAdapter{
//这里有自定义适配器代码
}
}

非常感谢您的帮助。谢谢大家!

看看这个。您必须在“菜单”文件夹中创建自己的菜单,然后使用onCreateContextMenu()方法对其进行充气。

好的,我已经找到了答案。在我的自定义listAdapter中,我在listView上添加了一个setOnItemLongClickListener。此setOnItemLongClickListener显示一个警报,其中包含我需要的选项。因此:

list.setOnItemLongClickListener(new OnItemLongClickListener() { //list is my listView

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    final int pos, long id) {
            //Whatever you wanna do
            }
 });
list.setOnItemLongClickListener(新的OnItemLongClickListener(){//list是我的listView
@凌驾
长单击(AdapterView arg0、视图arg1、,
最终整数位置,长id){
//你想干什么都行
}
});

不应该将上下文菜单添加到适配器上的项目而不是listview?我不这样认为,因为registerForContextMenu需要一个视图参数。我可能错了。行也是视图:)我认为这里的问题是listview中的滚动事件正在拦截longpress事件。你知道如何应对吗?(即,使滚动条不会截获长按)。如果需要的话,我可以显示“MyListAdapter”代码。好的,我能够找到它。在我的自定义listAdapter中,我在listView上添加了一个setOnItemLongClickListener。此setOnItemLongClickListener显示一个警报,其中包含我需要的选项。谢谢你提供的帮助!