Android использует пользовательский CursorAdapter с onContentChanged () - PullRequest
1 голос
/ 20 марта 2012

Я все еще пытаюсь создать хороший код с помощью курсора-адаптера в listView.

Я хочу, чтобы в моей деятельности, когда я изменял данные в курсоре, он автоматически обновлял курсор в адаптере, обновлял адаптер и, конечно, listView.

Magic, есть эта функция: 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) Интересно, является ли мой код хорошим способом передачи списка с помощью настраиваемого курсора Adapter.

Спасибо за внимание.

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

На самом деле все работает наоборот, onContentChanged вызывается после того, как адаптер получает уведомление notifyDataSetChanged.

Попробуйте изменить слушатель нажатия кнопки на это:

@Override
        public void onClick(View v) {

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

        }
1 голос
/ 12 декабря 2013

Чтобы функция onContentChanged () запускалась при каждом изменении резервных данных, необходимо передать флаг CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER в конструктор CursorAdapter.Как это:

mTheAdapter = new CursorAdapter(context, cursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

Обратите внимание, что это доступно только из APIv11.

Я читал это здесь :) http://developer.android.com/reference/android/widget/CursorAdapter.html#FLAG_REGISTER_CONTENT_OBSERVER

Надеюсь, это поможет!

0 голосов
/ 31 августа 2012
b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

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


        }
}
...