2013-09-24 2 views
0

я сделать что-то, как показано ниже:Как обновить ListView при изменении курсора?

public class WhitelistActivity extends ListActivity { 
    private DbAdapter dbHelper; 
    private SimpleCursorAdapter adapter; 
    private Cursor recordsCursor; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.whitelist); 

     dbHelper = new DbAdapter(this); 
     dbHelper.open(); 
     recordsCursor = dbHelper.fetchWhitelistRecords(); 
     startManagingCursor(recordsCursor); 
     String[] from = new String[]{DbAdapter.KEY_W_SENDER}; 
     int[] to = new int[]{R.id.text1}; 
     adapter = new SimpleCursorAdapter(this, R.layout.whitelist_row, recordsCursor, from, to); 
     setListAdapter(adapter); 
     ... 

     @Override 
     public boolean onContextItemSelected(MenuItem item) { 
      switch(item.getItemId()) { 
       case CONTEXT_MENU_DELETE_ID: 
       AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
       dbHelper.deleteWhitelistRecord(info.id); 
       adapter.changeCursor(recordsCursor); 
       adapter.notifyDataSetChanged(); 
       return true; 
      } 
      return super.onContextItemSelected(item); 
     }  

Однако, когда контекстное меню вызывается и объект будет удален, это не отражается на списке. Что мне не хватает?

+0

вам нужно либо запросить, либо воссоздать свой курсор. В вашем коде вы просто повторно используете его, не требуя, чтобы он отражал изменения. – njzk2

+0

@ njzk2, как именно я должен это делать? Я ожидал, что это «changeCursor» или «swapCursor». –

+1

либо заново создайте ('recordCursor = dbHelper.fetchWhitelistRecords();') курсор, либо запросите его ('recordsCursor.requery()') (но это устарело с api11. Я все еще упоминаю об этом при использовании startManagingCursor, который также устарел) – njzk2

ответ

0

При изменении курсора необходимо обновить его содержимое. Самый простой и рекомендуемый способ - создать новый курсор (если возможно, в Loaded).

recordsCursor = dbHelper.fetchWhitelistRecords(); 
adapter.changeCursor(recordsCursor); 

Не обязательно уведомлять DataSetChanged.

2

Курсор не обновляется до тех пор, пока вы не запросите базу данных. startManagingCursor не делает это автоматически. adapter.notifyDataSetChanged() «обновляет» ListView, но поскольку курсор не изменился, ничего не происходит.

Что вы должны действительно Рассмотрите возможность инкапсуляции базы данных в ContentProvider, а затем с помощью CursorLoader для управления курсором и запросами. Если вы это сделаете, жизнь станет намного проще. См. Loading Data in the Background, чтобы узнать, как настроить CursorLoader. Инкапсуляция базы данных в ContentProvider также проста, см. Руководство по API Creating a Content Provider.

Смежные вопросы