1

まず、私のコードを説明しましょう: ユーザーがボタンをクリックすると、このコードが実行されます:

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);

スタックトレースは次のとおりです。

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)

奇妙なことに、ユーザーがデータを取得するボタンを 2 回目にクリックしたときにのみ、この例外が発生します。初めてすべてがスムーズに進みます: listView が表示され、フッターが追加されます。ただし、2 回目は、一部のデバイスでこの例外が発生します。

これを修正する方法を知っている人はいますか?

4

2 に答える 2

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);

このコードは完全に機能します。

ただし、例外がスローされる理由をよく説明しているので、サムの答えを受け入れるつもりです。さらに、彼のおかげで、この解決策を作り上げることができました。だからサムに+1!:)

于 2013-03-09T09:45:05.273 に答える
1
if (mMyList.size() > 0){
    mMyListView.addFooterView(mMyFooterView);
}    

データがないときにフッターを削除したいようです。現在のコードでこのエラーを防ぐ方法はわかりませんが、別の方法をお勧めします。

  • 両方のデータ セットでフッターを使用する場合は、フッターを削除して再度追加しないでください (別のコンテンツが必要な場合は変更できます)。
  • データ セットが空の場合、ListView 全体を で非表示にしsetVisibilty(View.GONE)ます。

しかし、エラー ログとソース コードは明確です。呼び出しによってsetAdapter(null)、GingerBread で NPE をスローする内部 DataSetOberver が登録解除されません。

at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:778)
at android.widget.ListView.addFooterView(ListView.java:387)
于 2013-03-06T18:24:43.007 に答える