使用notifyDataSetChanged()时,Android API ListView不会更新;

时间:2013-04-26 04:40:47

标签: java android api listview

我很遗憾地写了一个似乎是常见问题的内容,但我已经完成了这个任务五个小时了,我只是放弃了。

我正在制作一个小型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

3 个答案:

答案 0 :(得分: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 :(得分:1)

问题是您正在创建ArrayAdapter的新实例并添加到该实例,该实例与ListView无关。

notifyDataSetChanged()会将事件发送到正在侦听的内容 - ListView正在侦听旧适配器。

答案 2 :(得分:0)

您似乎想要更新适配器,而不是要创建新的适配器。在这里,如果您再次呼叫listView.setAdapter(mAdapter),它会将此新适配器设置为ListView,它会起作用。

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