Android使用自定义CursorAdapter和onContentChanged()

时间:2012-03-20 07:28:35

标签: android cursor android-cursoradapter

我仍然试图通过在listView上使用cursorAdapter来创建一个好的代码。

我希望在我的活动中,当我更改光标中的数据时,它会自动更新适配器中的光标,更新适配器,当然还有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)我想知道我的代码是否是用自定义cursorAdapter提供listView的好方法。

感谢您的关注。

3 个答案:

答案 0 :(得分:2)

它实际上是相反的,在onContentChanged通知适配器后调用notifyDataSetChanged

尝试将按钮点击监听器更改为:

@Override
        public void onClick(View v) {

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

        }

答案 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

希望它有所帮助!

答案 2 :(得分:-1)

b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

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


        }
}