拡張した CursorAdapter にリンクされている ListView を更新しています。
通知を受け取ったら、適切なテーブル sqlite をアップグレードします。次に、カーソルを使用してテーブルからすべてのレコードを回復しchangeCursor()
、ListView を変更するために使用します。
残念ながら、おそらく彼がカーソルへの古い参照を使用しているためsetOnItemClickListener
、イベントがクラッシュし始めます。
次のコードは、データをテーブル sqlite に保存し、カーソルをリストビューに設定する AsyncTask (Activity X によって呼び出される) の最後に実行されます。最後にリストビューにイベントを追加します。
final Cursor cursor = dao.getAllRubrica();
dao.close();
CustomCursorAdapter provaAdapter = new CustomCursorAdapter(applicationContext,cursor,0);
//cursor.close();
ListView rubricaListView = (ListView) controlPanelActivity.findViewById(R.id.rubricaListView);
rubricaListView.setAdapter(provaAdapter);
controlPanelActivity.setRubricaListView(rubricaListView);
rubricaListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cursor.moveToPosition(position);
String target_email = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.TABLE_RUBRICA_DESTINATARIO));
String userEmail = controlPanelActivity.loadSharPrefs();
if(userEmail!=null && !userEmail.isEmpty()){
// ....
}
}
});
以下のコードは、Activity X が通知を受け取ったときに実行されるので、リストビューのカーソルを取得し、新しいカーソルで変更します。イベント setOnItemClickListener がクラッシュし始めます。
CustomCursorAdapter a = (CustomCursorAdapter) rubricaListView.getAdapter();
a.changeCursor(newCursor);
ここにエラーがあります (最初の行が重要です):
02-03 14:54:48.791: E/AndroidRuntime(1672): FATAL EXCEPTION: main 02-03 14:54:48.791: E/AndroidRuntime(1672): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: SELECT _id, destinatario, inizio_conversazione, nick_dest, flag_new_mess FROM rubrica 02-03 14:54:48.791: E/AndroidRuntime(1672): at Android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 02-03 14:54:48.791: E/AndroidRuntime(1672): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:58)
02-03 14:54:48.791: E/AndroidRuntime(1672): android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:151) 02-03 14:54:48.791: E/AndroidRuntime(1672): at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:124) 02-03 14:54:48.791: E/AndroidRuntime(1672): android.database.AbstractCursor.moveToPosition(AbstractCursor.java:213) 02-03 で14:54:48.791: E/AndroidRuntime(1672): com.app.task.GetRubricaTask$1.onItemClick(GetRubricaTask.java:211) 02-03 14:54:48.791: E/AndroidRuntime(1672): Android で。 widget.AdapterView.performItemClick(AdapterView.java:298) 02-03 14:54:48.791: E/AndroidRuntime(1672): android.widget.AbsListView.performItemClick(AbsListView.java:1086) 02-03 14:54: 48.791: E/AndroidRuntime(1672): android.widget.AbsListView$PerformClick.run(AbsListView.java:2855) 02-03 14:54:48.791:E/AndroidRuntime(1672): android.widget.AbsListView$1.run(AbsListView.java:3529) 02-03 14:54:48.791: E/AndroidRuntime(1672): android.os.Handler.handleCallback(Handler. java:615) 02-03 14:54:48.791: E/AndroidRuntime(1672): android.os.Handler.dispatchMessage(Handler.java:92) 02-03 14:54:48.791: E/AndroidRuntime(1672) : android.os.Looper.loop(Looper.java:137) 02-03 14:54:48.791: E/AndroidRuntime(1672): android.app.ActivityThread.main(ActivityThread.java:4745) 02-03 14:54:48.791: E/AndroidRuntime(1672): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 02-03 14:54:48.791: E/AndroidRuntime(1672): java.lang.reflect で。 Method.invoke(Method.java:511) 02-03 14:54:48.791: E/AndroidRuntime(1672): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 02-03 で14:54:48.791:E/AndroidRuntime(1672): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 02-03 14:54:48.791: E/AndroidRuntime(1672): dalvik.system.NativeStart.main で(ネイティブメソッド)
への呼び出し後にイベントを実行し続けるにはどうすればよいchangeCursor()
ですか? AsyncTask で何かを変更する必要がありますか?