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

时间:2013-03-06 17:23:27

标签: java android listview nullpointerexception footer

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

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

Async完成后,执行以下代码:

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并添加页脚。第二次,我在某些设备上遇到了这个例外。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

但是错误日志和源代码是明确的,调用setAdapter(null)不会取消注册在GingerBread中抛出NPE的内部DataSetOberver:

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

答案 1 :(得分:1)

这就是我解决它的方式:

当用户点击按钮时,执行以下代码:

mMyListView.setVisibility(View.INVISIBLE);
//Fetch some data in an AsyncTask

Async完成后,执行以下代码:

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

此代码完美无缺。

我会接受Sam的回答,因为他解释了为什么会抛出异常。另外,多亏了他,我可以弥补这个解决方案。所以山姆+1! :)