Android API ListView在使用notifyDataSetChanged()时不会更新。

3
抱歉,您遇到了一种普遍的问题,但我已经在这个任务上花费了五个小时,而且我放弃了。我正在制作一个小型的Android应用程序,现在它只需要保持一个小的SQLite数据库并能够编写/编辑笔记。使用SQL都很好,我的问题在于ListView。无论我做什么,当我添加新的笔记时,它都不会更新。查看新的笔记的唯一方法是进入其他笔记的编辑模式并退出。以下是源代码的相关部分:
public class MainActivity extends Activity {

ArrayAdapter<NoteItem> mAdapter;
public static NoteDataBase ndb;
ListView listView;
ArrayList a;

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ndb = new NoteDataBase(this);
    a = ndb.getAllNotes();

            //LISTVIEW DO NOT TOUCH
/***********/   mAdapter = new ArrayAdapter<NoteItem>(this, 
/***********/       android.R.layout.simple_list_item_1, a);
/***********/       listView = (ListView) findViewById(R.id.listView1);
/***********/   listView.setAdapter(mAdapter);
            //*****************

}

//New Note button
public void newNoteAction(View view){
    ndb.addNote(new NoteItem("Title", "Contents"));
    a = ndb.getAllNotes();
    mAdapter = new ArrayAdapter<NoteItem>
                                (this, android.R.layout.simple_list_item_1, a);
    mAdapter.notifyDataSetChanged();
    System.out.println(ndb.getAllNotes().size());
}

结尾的打印语句只是为了确认是否成功创建了新笔记。

希望我提供的信息足够,如果需要其他帮助,请告诉我。我已经尝试了几乎所有我读到的方法,但在完成一个任务上花费了将近五个小时,有时候我会发疯 :)

谢谢,

Shef


你是在哪个事件上尝试添加新的注释?能否展示一下? - GrIsHu
它仅仅是在活动的xml中定义的方法。在xml中有一个名为noteNew的按钮,当点击它时,会调用NewNoteAction()。 - Shef
我正在使用 Android API 11。 - Shef
3个回答

3
public void newNoteAction(View view){
    ndb.addNote(new NoteItem("Title", "Contents"));
    // don't do this
    // you are creating a new adapter and not binding it back to listview
    // a = ndb.getAllNotes(); 
    // mAdapter = new ArrayAdapter<NoteItem>(this, android.R.layout.simple_list_item_1, a);
    mAdapter.add(new NoteItem("Title", "Contents"));
    mAdapter.notifyDataSetChanged();
    System.out.println(ndb.getAllNotes().size());
}

1
看起来问题在于您正在创建一个新的 ArrayAdapter 实例并向其添加内容,但这与 ListView 没有关联。 notifyDataSetChanged()会向任何正在监听的对象发送事件 - ListView正在监听旧适配器。

0

看起来你想要更新适配器,但实际上你正在创建一个新的适配器。在这里,如果你只是再次调用listView.setAdapter(mAdapter),它会将这个新的适配器设置到ListView中,然后它就可以工作了。

但每次创建一个新的适配器并不是一个好方法。由于你正在使用数据库,请尝试阅读一下CursorAdapter


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接