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());
}

最后的打印只是为了看看它是否真的在创建新的笔记。

我希望我提供了足够的信息,如果您需要其他信息,请告诉我。我几乎尝试了我已经读过的所有内容,但是在完成一项任务将近五个小时之后,有一点我会发疯:)

谢谢,

舍夫

4

3 回答 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());
}
于 2013-04-26T04:49:27.190 回答
1

看起来问题是您正在创建一个新实例ArrayAdapter并添加到它,它与ListView.

notifyDataSetChanged()将事件发送到正在监听的任何东西 -ListView正在监听旧适配器。

于 2013-04-26T04:48:26.403 回答
0

似乎您想更新适配器,但您正在创建一个新适配器。在这里,如果您listView.setAdapter(mAdapter)再次调用,它会将这个新适配器设置为ListView并且它会工作。

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

于 2013-04-26T04:48:14.523 回答