我遇到了一个问题,每次长按列表视图上的项目时都会调用onCreateContextMenu。由于它每次都被调用,它会覆盖我对菜单项所做的任何更改
在我的MainActivity的onCreate()中,我有这个。
trackingList = (ListView) findViewById(R.id.trackingList);
listAdapter = new SummonerAdapter(MainActivity.this, summonerNames);
trackingList.setAdapter(listAdapter);
registerForContextMenu(trackingList);
在我的onCreateContextMenu()中
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.list_context_menu, menu);
this.menu = menu;
toggle = menu.findItem(R.id.postGameNotif);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
int listPosition = info.position -1;
SharedPreferences prefs = getApplicationContext().getSharedPreferences("summoner_prefs", MODE_PRIVATE);
boolean postNotif = prefs.getBoolean(summonerNames.get(listPosition) + "_postNotif",false);
if (postNotif){
toggle.setTitle("Disable post-game notifications");
}
else
toggle.setTitle("Enable post-game notifications");
}
我的onPrepareOptionsMenu()为空
作为副作用,当我从另一个类调用showContextMenu()时,它将崩溃,除非我之前先长按了一个列表项。但是,如果我已经打开上下文菜单一次,它就会按预期工作。我在这里发现了同样的问题,但似乎没有得到解决
看起来,当我从另一个类调用showContextMenu()时,它会再次调用onCreateContextMenu(),但menuInfo为null。
尝试一下,对于您的场景,不要为您的listview注册上下文菜单,而是将onLongClickListener添加到listview中的每个子视图,即覆盖getView()并将侦听器添加到其中,并在每次触发侦听器时调用showContextMenu(),并通过删除适配器信息来修改oncreateOptions菜单,因为如果你在getView中处理它,你很清楚它的位置。
你的位置应该是最终的,然后才能放入监听器,或者你可以找到另一种方法,通过标签或新的int变量将其传递给监听器
希望它能帮助