Android использует пользовательский CursorAdapter с onContentChanged ()

1

Я все еще пытаюсь сделать хороший код, используя cursorAdapter в 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;
    }

Хорошо, опять мой вопрос:

1) Как я могу вызвать функцию onContentChanged() моего адаптера (без явно явного вызова)

2) Интересно, является ли мой код хорошим способом подачи listView с помощью настраиваемого cursorAdapter.

Спасибо, что обратили внимание.

Теги:
cursor
android-cursoradapter

3 ответа

2
Лучший ответ

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

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

@Override
        public void onClick(View v) {

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

        }
  • 0
    Ну, тоже не работает, если я вызываю notifyDataSetChanged, он не вызывает onContentChanged. Чем больше я пытаюсь думать об этом, тем больше я думаю: «Эй, должно быть, ЛУЧШИЙ способ сделать такую простую вещь», но я не понимаю, что это такое. Я имею в виду, что даже на сайте Android Developper они делают эту странную вещь, каждый раз, когда они хотят обновить представление списка, они воссоздают курсор, вводят его каждый раз, создают новый адаптер, воздействуют на курсор, затем влияют на адаптер для просмотра списка. ... это действительно безумие, как будто я никогда не видел пример правильного использования cursorAdapter с listView
  • 0
    Я отредактировал свой ответ, ты пробовал что-то подобное?
Показать ещё 1 комментарий
1

Чтобы включить 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
b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

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


        }
}
  • 1
    Пожалуйста, объясните, как это отвечает на вопрос

Ещё вопросы

Сообщество Overcoder
Наверх
Меню