ClassCastException:当使用标题为 header 的 ContextMenu 时,无法将 HeaderViewListAdapter 转换为 Android 中的 MenuAdapter

ClassCastException: HeaderViewListAdapter cannot be cast to MenuAdapter in Android when using a ContextMenu with a header title

当我长按 ListView 中的列表项并注册了一个上下文菜单时会出现上述错误,该菜单随后会显示,用户可以选择一个选项。

我在实际设备上没有收到任何错误,但在模拟器(API 级别 25)上,我发现上面的错误。在堆栈跟踪中,没有引用我自己的代码,但它来自 MenuPopupWindow 第 141 行,如下所示(这是 Android 预定义的 class,不是我的 class ).当我在 Android 来源中查看该文件时,有这一行:

((MenuAdapter) getAdapter()).getAdapterMenu().close(false /* closeAllMenus */);

这似乎导致以下异常:

E/UncaughtException: java.lang.ClassCastException: android.widget.HeaderViewListAdapter 无法转换为 com.android.internal.view.menu.MenuAdapter 在 android.widget.MenuPopupWindow$MenuDropDownListView.onKeyDown(MenuPopupWindow.java:141)

我已检查调用片段中的 onCreateContextMenu 方法没有问题 - 崩溃发生在 onCreateContextMenu 执行完成后。

我以前在模拟器或真实设备上都没有遇到过这样的问题,但这只是在将 UI 库升级到 androidx 库后发生的。

所以我想知道这是否与它有任何关系(但它在真实设备上没有问题。 由于问题发生在内部 Android class 我有点不知道如何解决这个问题或者这是否与我的代码有任何关系或者它是否是内部 Android 错误?

更新: 当我遗漏以下行时,它不会在模拟器上崩溃(但显然我的上下文菜单没有 header):

menu.setHeaderTitle("Tournament options");

菜单来自重写方法内部的位置:

public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenu.ContextMenuInfo menuInfo) 

此外,我在模拟器上没有收到此错误 运行 API 29。 我测试的设备运行 API 28。 由于我没有 API 25 的真实设备(它在模拟器上崩溃),我不确定它是否会在 API 25 的真实设备上崩溃。但是当然,担心的是模拟器API25死机。

感谢任何帮助。

好吧,我冷重启了模拟器,然后在任何 API 级别上都没有问题。 只是想我会 post 它作为答案,以防其他人遇到这个问题。必须是 API 级别 25 上的模拟器软件错误。