1

拡張した 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 で何かを変更する必要がありますか?

4

2 に答える 2