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");


            }
        });

光标适配器:

@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 的好方法。

感谢您的关注。

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

要使 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

希望能帮助到你!

于 2013-12-12T04:32:09.430 回答
-1
b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

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


        }
}
于 2012-08-31T18:33:05.540 回答