Android с использованием пользовательского CursorAdapter с onContentChanged()

Я все еще пытаюсь сделать хороший код, используя cursorAdapter в listView.

Я хочу, чтобы в моей деятельности, когда я меняю данные в курсоре, он автоматически обновлял курсор в адаптере, обновлял адаптер и, конечно, 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");


            }
        });

КурсорАдаптер:

@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 с помощью пользовательского курсора-адаптера.

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


person Sebastien FERRAND    schedule 20.03.2012    source источник


Ответы (3)


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

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

@Override
        public void onClick(View v) {

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

        }
person devmiles.com    schedule 20.03.2012
comment
Ну, тоже не работает, если я вызываю notifyDataSetChanged, он не вызывает onContentChanged. Чем больше я пытаюсь об этом думать, тем больше я думаю. Эй, должен быть ЛУЧШИЙ способ сделать такую ​​простую вещь, но я не понимаю, что это такое. Я имею в виду, что даже на веб-сайте разработчиков Android они делают эту странную вещь: каждый раз, когда они хотят обновить список, они воссоздают курсор, загружают его при каждом появлении, создают новый адаптер, влияют на курсор, а затем влияют на адаптер для listView ... это действительно безумие, как будто я никогда не видел примера правильного использования cursorAdapter с listView - person Sebastien FERRAND; 20.03.2012
comment
К сожалению, да, и до сих пор не работает. В любом случае должна быть проблема с моим кастомным CursorAdapter, я попробую разобраться сам, потому что это другая проблема. Спасибо за помощь, расскажу как у меня это получилось (Лишь бы у меня получилось). - person Sebastien FERRAND; 20.03.2012

Чтобы 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

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

person khigianguyen    schedule 12.12.2013

person    schedule
comment
Пожалуйста, объясните, как это отвечает на вопрос - person CocoNess; 04.10.2012