2011-10-25 2 views
2

Мой курсор извлекает данные из sqlite.Update ListView с курсором и 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

Я думаю, что и нужно обновить курсор, что и перешел к адаптеру. – Vivek

+0

Как обновить курсор? Я могу создать новый курсор и снова назначить его адаптеру. Но так выглядит плохо? – complez

ответ

7

Вам нужно либо requery() существующий Cursor или выполнить запрос снова, чтобы получить свежую Cursor и поменять новый Cursor в свой CursorAdapter.

+0

requery decaperpted. Есть ли новый подход к этой проблеме? – 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);} 
} 
Смежные вопросы