每次调用onCreateContextMenu并且menuItem返回null

时间:2016-01-08 21:55:00

标签: android android-listview android-contextmenu

我遇到的问题是每次长按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。

1 个答案:

答案 0 :(得分:0)

尝试使用此方法,为您的方案而不是为列表视图注册上下文菜单,将onLongClickListener添加到Listview中的每个子视图,即覆盖getView()并向其添加侦听器,并在每次调用showContextMenu()时触发侦听器,并通过删除适配器信息来修改oncreateOptions菜单,因为如果你在getView中处理它,你很清楚它的位置。

你的位置在适合听众之前应该是最终的,或者你可以通过标签或新的int变量找到通过你的听众传递它的另一种方式

希望有所帮助