我遇到的问题是每次长按listview上的项目时都会调用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()时,它将崩溃,除非我先前已经长按了列表项。但如果我已经打开了一次上下文菜单,它将按预期工作。我发现同样的问题here,但似乎没有得到解决 看来当我从其他类调用showContextMenu()时,它再次调用onCreateContextMenu(),但menuInfo为null。
答案 0 :(得分:0)
尝试使用此方法,为您的方案而不是为列表视图注册上下文菜单,将onLongClickListener添加到Listview中的每个子视图,即覆盖getView()并向其添加侦听器,并在每次调用showContextMenu()时触发侦听器,并通过删除适配器信息来修改oncreateOptions菜单,因为如果你在getView中处理它,你很清楚它的位置。
你的位置在适合听众之前应该是最终的,或者你可以通过标签或新的int变量找到通过你的听众传递它的另一种方式
希望有所帮助