(この対処が正しいのかはわかりません)
落ちるところ
ExpandableListView
+CursorTreeAdapter
+LoaderCallbacks
で実装していて、
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.setChildrenCursor(ID, data);
}
setChildrenCursor
しようとするとNullPointerException
が出ることがある。
CursorTreeAdapter.javaの実装を見てみると、
public void setChildrenCursor(int groupPosition, Cursor childrenCursor) {
/*
* Don't request a cursor from the subclass, instead we will be setting
* the cursor ourselves.
*/
MyCursorHelper childrenCursorHelper = getChildrenCursorHelper(groupPosition, false);
/*
* Don't release any cursor since we know exactly what data is changing
* (this cursor, which is still valid).
*/
childrenCursorHelper.changeCursor(childrenCursor, false); // <- ここで落ちる
}
synchronized MyCursorHelper getChildrenCursorHelper(int groupPosition, boolean requestCursor) {
MyCursorHelper cursorHelper = mChildrenCursorHelpers.get(groupPosition);
if (cursorHelper == null) {
if (mGroupCursorHelper.moveTo(groupPosition) == null) return null; // <- nullを返すことがある
final Cursor cursor = getChildrenCursor(mGroupCursorHelper.getCursor());
cursorHelper = new MyCursorHelper(cursor);
mChildrenCursorHelpers.put(groupPosition, cursorHelper);
}
return cursorHelper;
}
childrenCursorHelper
がnull
になることがあり、changeCursor()
を呼び出すのでNullPointerException
が出る。
・・nullチェックされていなくて涙目です。
が、nullになる状況を作り出している私のコードに問題があるのかもしれません。
(まだわかってない)
対処
以下のような応急処置をしました。
先にGroupCursorの生存を確認してから、setChildrenCursor
するようにした。
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
Cursor groupCursor = adapter.getGroup(ID);
if (groupCursor == null) {
return;
}
adapter.setChildrenCursor(ID, data);
}
getGroup
の中身は・・
public Cursor getGroup(int groupPosition) {
// Return the group Cursor pointing to the given group
return mGroupCursorHelper.moveTo(groupPosition);
}
先ほどの「nullチェックされてなくて涙目」な部分を、
「自分で事前にチェックしてみた」ということになった。
NullPointerExceptionをcatchしてやりすごすよりは、良いかな??