助けてください。
SimpleCursorAdaptor を使用して ListView を設定する方法を学習しています。SimpleCursorAdapter を使用して入力する ListView を持つアクティビティがあります。リスト項目の1つをクリックすると、別のアクティビティが開始されるはずですが、新しいアクティビティが開始されるとすぐに次のログが表示されます:
01-11 15:28:31.847: E/AndroidRuntime(996): FATAL EXCEPTION: main
01-11 15:28:31.847: E/AndroidRuntime(996): android.database.StaleDataException: Attempted to access a cursor after it has been closed.
01-11 15:28:31.847: E/AndroidRuntime(996): at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.database.BulkCursorToCursorAdaptor.getCount(BulkCursorToCursorAdaptor.java:70)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:196)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.database.CursorWrapper.moveToPosition(CursorWrapper.java:162)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.support.v4.widget.CursorAdapter.getItemId(CursorAdapter.java:225)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.widget.AbsListView.onSaveInstanceState(AbsListView.java:1782)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.View.dispatchSaveInstanceState(View.java:11839)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:2576)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.widget.AdapterView.dispatchSaveInstanceState(AdapterView.java:782)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.view.View.saveHierarchyState(View.java:11822)
01-11 15:28:31.847: E/AndroidRuntime(996): at com.android.internal.policy.impl.PhoneWindow.saveHierarchyState(PhoneWindow.java:1566)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.Activity.onSaveInstanceState(Activity.java:1188)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:498)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.Activity.performSaveInstanceState(Activity.java:1137)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1215)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:2951)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3010)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.ActivityThread.access$900(ActivityThread.java:130)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1222)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.os.Handler.dispatchMessage(Handler.java:99)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.os.Looper.loop(Looper.java:137)
01-11 15:28:31.847: E/AndroidRuntime(996): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-11 15:28:31.847: E/AndroidRuntime(996): at java.lang.reflect.Method.invokeNative(Native Method)
01-11 15:28:31.847: E/AndroidRuntime(996): at java.lang.reflect.Method.invoke(Method.java:511)
01-11 15:28:31.847: E/AndroidRuntime(996): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-11 15:28:31.847: E/AndroidRuntime(996): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-11 15:28:31.847: E/AndroidRuntime(996): at dalvik.system.NativeStart.main(Native Method)
私はそれを見ましたが、このエラーがどこから生じたのかわかりませんでした。
この BulkCursorToCursorAdaptor クラスについてグーグルで検索したところ、さまざまな状況でさまざまな理由でこの例外がスローされることがわかりました。
アダプターでカーソルを閉じていないため、エラーの原因を説明していただけないでしょうか。
コードのスニペットは次のとおりです。
ListView を使用したアクティビティ:
MyAdapter adapter;
ListView list;
@Override
public void onCreate(Bundle savedInstanceState)
{
....
list = (ListView)findViewById(R.id.myList);
list.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> myAdapter, View myView, int myItemInt, long myLong)
{
Intent request = new Intent(MyActivity.this, NewActivity.class);
startActivity(request);
}
}
getSupportLoaderManager().restartLoader(0, null, this);
adapter = new MyAdapter(this,
R.layout.list_item,
null, new String[]{MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME},
new int[] {R.id.Name}, Adapter.NO_SELECTION);
list.setAdapter(adapter);
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle)
{
return new CursorLoader(this,
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME},
null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor aCursor)
{
adapter.swapCursor(aCursor);
}
@Override
public void onLoaderReset(Loader<Cursor> aCursor)
{
adapter.swapCursor(null);
}
これはアダプターです:
public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags)
{
super(context, layout, c, from, to, flags);
}
@Override
public int getCount()
{
Cursor c = getCursor(); // without this, sometimes, I get NullPointerException
return c.getCount();
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Cursor c = getCursor();
c.moveToPosition(position);
....
....
}
助けてください