java - 某些设备上的 addFooterView() 出现 NullPointerException

标签 java android listview nullpointerexception footer

首先,让我解释一下我的代码: 当用户单击按钮时,将执行以下代码:

mMyListView.removeFooterView(mMyFooterView);
mMyListView.setAdapter(null);
//Fetch some data in an AsyncTask

异步完成后,将执行以下代码:

if (mMyList.size() > 0){
    mMyListView.addFooterView(mMyFooterView);
}    
MyListAdapter myListAdapter = new MyListAdapter(this, mMyList);
mMyListView.setAdapter(myListAdapter);

不过这就是问题所在。因为在某些设备上,我在这一行收到 NullPointerException:

mMyListView.addFooterView(mMyFooterView);

这是 StackTrace:

java.lang.NullPointerException
at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:778)
at android.widget.ListView.addFooterView(ListView.java:387)
at android.widget.ListView.addFooterView(ListView.java:402)
at com.augustinianum.augustinianum.ManualCheckActivity.showScheduleChanges(ManualCheckActivity.java:84)
at com.augustinianum.augustinianum.ManualCheckActivity.access$1(ManualCheckActivity.java:81)
at com.augustinianum.augustinianum.ManualCheckActivity$CheckScheduleChange.onPostExecute(ManualCheckActivity.java:192)
at com.augustinianum.augustinianum.ManualCheckActivity$CheckScheduleChange.onPostExecute(ManualCheckActivity.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)

奇怪的是,当用户第二次单击获取数据的按钮时,我只会得到这个异常。第一次一切顺利:显示 listView 并添加页脚。但是第二次,我在某些设备上遇到了这个异常。

有人知道如何解决这个问题吗?

最佳答案

if (mMyList.size() > 0){
    mMyListView.addFooterView(mMyFooterView);
}    

当没有数据时,您似乎想删除页脚。虽然我不知道如何使用您当前的代码来防止此错误,但我推荐一种不同的策略。

  • 如果两个数据集都将使用页脚,则不要删除它以再次添加它(如果您想要不同的内容,您仍然可以更改它。)
  • 当数据集为空时,使用 setVisibilty(View.GONE) 隐藏整个 ListView。

但错误日志和源代码很清楚,调用 setAdapter(null) 不会注销内部 DataSetOberver,这会在 GingerBread 中抛出 NPE:

at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:778)
at android.widget.ListView.addFooterView(ListView.java:387)

关于java - 某些设备上的 addFooterView() 出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253945/

相关文章:

android - Gradle 5 中 Artifact 的分类?

android - 处理 Widget ListView 中的项目点击 [Android]

java - 为什么我的应用程序无法从我的 API 读取 JSON?

java - 如何通过分段文件上传接受表单参数

android - 使用自定义行为为 CollapsingToolbar 创建多个 "anchor points"/位置

android - 我可以以编程方式选择 Android 布局文件夹吗?

android - 为 ListView 中的按钮添加点击监听器

listview - 如何使ListView中的文本居中?

java - 在 Apache Beam 中使用 defaultNaming 进行动态窗口写入

java - 我如何取回 Alfresco 中任何文件的唯一 ID?