2013-04-26 56 views
3

我很抱歉寫下了似乎是一個常見問題,但我已經在這一項任務上工作了五個小時,而我只是放棄了。使用notifyDataSetChanged()時,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

+0

哪個API使用 – 2013-04-26 04:45:00

+0

在哪個事件中您嘗試添加新的注意事項您能否顯示該事件? – GrIsHu 2013-04-26 04:51:16

+0

它只是在活動的xml中定義的方法。在xml中有一個叫做noteNew的按鈕,單擊時調用NewNoteAction()。 – Shef 2013-04-26 04:57:55

回答

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

謝謝!它現在完美:) – Shef 2013-04-26 05:00:43

+0

偉大而快樂的編碼.. – Aprian 2013-04-26 05:04:21

0

好像你想要的更新適配器,而是創建一個新的適配器。在這裏,如果你只是再次調用listView.setAdapter(mAdapter),它會將這個新適配器設置爲ListView,它會起作用。

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

1

看起來問題是您正在創建ArrayAdapter的新實例並將其添加到該實例中,該實例與ListView未關聯。

notifyDataSetChanged()將發送任何正在監聽的事件 - ListView正在監聽舊適配器。

相關問題