2011-10-25 17 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); 

次に、私はテーブルに新しい行を挿入し、データセットが変更通知が、私は、DBの接続を閉じる必要がある場合、リストビューは

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

を更新していませんか?

+2

必要がありませんが、私はuはuがアダプタに渡されているカーソルを更新する必要があると思うonDestroy – user999717

+0

前にそれを閉じます。 – Vivek

+0

カーソルを更新するには?私は新しいカーソルを作成し、それを再びアダプターに割り当てることができます。しかし、その方法は悪いようですか? – complez

答えて

7

あなたはrequery()既存Cursor、または新鮮なCursorを取得し、あなたのCursorAdapterに新しいCursorを交換するために、再度クエリを実行するのいずれかにする必要があります。

+0

クエリーはデパートされます。この問題の新しいアプローチがありますか? – complez

+6

@complez:もう一度クエリを実行すると新しいCursorを取得し、新しいCursorを 'CursorAdapter'に' changeCursor() 'を使ってスワップします。 – 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);} 
} 
関連する問題