簡體   English   中英

使用notifyDataSetChanged()時,Android API ListView不會更新;

[英]Android API ListView doesn't update when using notifyDataSetChanged();

我很遺憾地寫了一個似乎是常見問題的內容,但我已經完成了這個任務五個小時了,我只是放棄了。

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

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

看起來問題是你正在創建一個新的ArrayAdapter實例並添加到它,它與ListView無關。

notifyDataSetChanged()將事件發送到正在偵聽的內容 - ListView正在偵聽舊適配器。

看起來你想要更新適配器,而是你要創建一個新的適配器。 在這里,如果你再次調用listView.setAdapter(mAdapter) ,它會將這個新的適配器設置為ListView ,它會工作。

但是每次創建一個新的適配器都不是一個好方法。 由於您正在使用數據庫,請嘗試閱讀CursorAdapter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM