1

listViewでcursorAdapterを使用して、適切なコードを作成しようとしています。

アクティビティで、カーソル内のデータを変更すると、アダプター内のカーソルが自動的に更新され、アダプターともちろん listView が更新されることを望みます。

マジック、この関数があります: onContentChanged() これは、このアダプターのカーソルが「通知」されたときに呼び出される CursorAdapter の関数です。

しかし、私はこの関数の呼び出しに失敗しています。

ここで、コードの興味深い部分 (これは機能しません) です。どこが間違っているのか、何が誤解なのかを誰かが教えてくれれば、感謝します。

アクティビティ :

public class EverydayNotesAndroid3Activity extends Activity {
    /** Called when the activity is first created. */

    private Cursor cursorNotes;
    private NoteDataSource dataNoteConnector;
    private NotesCursorAdapter notesCursorAdapter;
    private InputMethodManager imm;
    private Activity activity;
    private ListView listView;
    private int positionItem;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        activity = this;

        dataNoteConnector = new NoteDataSource(activity);

        dataNoteConnector.open();

        cursorNotes = dataNoteConnector.getAllNotes();

        startManagingCursor(cursorNotes);

        listView = (ListView) findViewById(R.id.main_list);

        notesCursorAdapter = new NotesCursorAdapter(activity, cursorNotes, 3);

        listView.setAdapter(notesCursorAdapter);

        Button b = new Button(activity);

        b = (Button) findViewById(R.id.done);

        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                dataNoteConnector.createNoteTop("Hello stack overflow world");


            }
        });

CursorAdapter :

@Override


public void onContentChanged(){
        System.out.println("foux de fafa");
        this.notifyDataSetChanged();
    }

私の問題は、この関数を呼び出したいのですが、呼び出されていないことです。

そしてデータベースクラスですが、データベースへの挿入は問題ないので、それが重要かどうかはわかりません:

public Cursor create

NoteTop(String note) {

        idNoteMin++;
        ContentValues values = new ContentValues();
        values.put(DataBaseHelper.DATABASE_ID_NOTE, idNoteMin);
        values.put(DataBaseHelper.DATABASE_CONTENT_NOTE, note);
        long insertId = database.insert(DataBaseHelper.DATABASE_TABLE_NOTE, null,
                values);
        Cursor cursor = database.query(DataBaseHelper.DATABASE_TABLE_NOTE,
                allColumns, DataBaseHelper.DATABASE_ID_NOTE + " = " + insertId, null,
                null, null, null);
        cursor.moveToFirst();
        return cursor;
    }

わかりました、もう一度、私の2つの質問:

1)アダプタの onContentChanged() 関数を呼び出すにはどうすればよいですか (もちろん、明示的に呼び出す必要はありません)。

2) 私のコードは、listView にカスタムの cursorAdapter を供給する良い方法なのだろうか。

ご注意いただきありがとうございます。

4

3 に答える 3

2

実際には逆に機能しonContentChanged、アダプタに。で通知された後に呼び出されnotifyDataSetChangedます。

ボタンクリックリスナーを次のように変更してみてください。

@Override
        public void onClick(View v) {

            dataNoteConnector.createNoteTop("Hello stack overflow world");
            notesCursorAdapter.notifyDataSetChanged();

        }
于 2012-03-20T07:36:21.723 に答える
-1
b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            dataNoteConnector.createNoteTop("Hello stack overflow world");


        }
}
于 2012-08-31T18:33:05.540 に答える