2011-10-25 34 views
2

我的光标是从sqlite中获取数据。用光标和SimpleCursorAdapter更新列表视图

msgsdbadapter = new MSGSDBAdapter(this); 
msgsdbadapter.open(); 
cons_cursor = msgsdbadapter.fetchConversations(); 
startManagingCursor(cons_cursor); 

之后,我创建一个SimpleCursorAdapter并将其分配给ListView。 ListView现在可以很好地显示一些记录。

String[] from = new String[] { MSGSDBAdapter.KEY_FROM, MSGSDBAdapter.KEY_MSG, MSGSDBAdapter.KEY_DATE}; 
int[] to = new int[] { R.id.lblFrom, R.id.lblMsgExcerpt, R.id.lblDate }; 
cons_cursor_adapter = new SimpleCursorAdapter(context, R.layout.conversation_item, cons_cursor, from, to); 
lvConversations.setAdapter(cons_cursor_adapter); 

接下来,我插入新行插入到表中,并通知数据集变化,但ListView控件不更新

msgsdbadapter.createMsg(msg); 
cons_cursor_adapter.notifyDataSetChanged(); 

当我应该关闭数据库连接?

+2

没有必要的onDestroy – user999717

+0

我觉得你需要更新u必须传递给适配器光标前关闭它。 – Vivek

+0

如何更新光标?我可以创建新的光标并将其重新分配给适配器。但那样看起来很糟糕? – complez

回答

7

你需要或者requery()现有Cursor,或再次运行查询,以取得一个新的Cursor和交换新Cursor到您CursorAdapter

+0

需求被降低。这个问题有没有新的方法? – complez

+6

@complez:再次运行查询以获得新的'Cursor',并使用'changeCursor()'将新的'Cursor'交换到您的'CursorAdapter'中。 – CommonsWare

+0

这个更新的解决方案工作得很好,但我想知道为什么'adapter.notifyDataSetChanged()'不能自己做到这一点? – Kristopher

0

如果您使用ListFragment最好的解决办法是把这个在这个样品内部:

public SimpleCursorAdapter myNote; 
    public class NOteLIST_MAIN extends ListFragment { 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onResume() { 
     super.onResume(); 
     myNote.getCursor().requery();//Don't forget to put these on onResume } 

    private void DataLoader(){private void DataFiller(){ 
      myNote = new SimpleCursorAdapter(getActivity(), R.layout.notes_row_line, notesCursor, from, to,0); 
      setListAdapter(myNote);} 
}