0

Я пытаюсь использовать следующий подход:Как обновить ListView с новыми данными таблицы?

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    recordsCursor = dbHelper.fetchRecords1(); 
    startManagingCursor(recordsCursor); 
    String[] from = new String[]{DbAdapter.KEY_BL_SENDER, DbAdapter.KEY_BL_READ}; 
    int[] to = new int[]{R.id.text1, R.id.background}; 
    adapter = new SimpleCursorAdapter(this, R.layout.row, recordsCursor, from, to); 
    setListAdapter(adapter); 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
... 
case R.id.list1: 
    recordsCursor = dbHelper.fetchRecords1(); 
    String[] fromBL = new String[]{DbAdapter.KEY_BL_SENDER, DbAdapter.KEY_BL_READ}; 
    int[] toBL = new int[]{R.id.text1, R.id.background}; 
    Log.i(TAG, "count: "+recordsCursor.getCount()); // returns 475 
    adapter = new SimpleCursorAdapter(this, R.layout.row, recordsCursor, fromBL, toBL); 
    adapter.changeCursor(recordsCursor); 
    adapter.notifyDataSetChanged(); 
    return true; 

case R.id.list2: 
    recordsCursor = dbHelper.fetchRecords2(); 
    String[] from = new String[]{DbAdapter.KEY_W_SENDER}; 
    int[] to = new int[]{R.id.text1}; 
    Log.i(TAG, "count: "+recordsCursor.getCount()); // returns 0 
    adapter = new SimpleCursorAdapter(this, R.layout.row, recordsCursor, from, to); 
    adapter.changeCursor(recordsCursor); 
    adapter.notifyDataSetChanged(); 
    return true; 

Но не обновляет список. Когда показаны записи из fetchRecords1, они не заменяются записями из другой таблицы. Что не так в моем коде?

+2

где вы приписываете этот адаптер в своем списке? – Dyna

+0

@ Dyna, я обновил свой код, чтобы отразить его –

+0

Ответ, который дал вам @blahdiblah, решит вашу проблему! – Dyna

ответ

1

Кратчайший изменение вынимать эти строки в коммутаторе:

adapter.changeCursor(recordsCursor); 
adapter.notifyDataSetChanged(); 

и заменить их:

setListAdapter(adapter); 

При установке адаптера на новый SimpleCursorAdapter, что не распространяйте обратно в ListView. В ListView все еще есть ссылка на исходный адаптер, который был установлен с помощью setListAdapter, в то время как ваш новый адаптер не подключен к списку ListView.

Более элегантное изменение было бы назвать changeCursorAndColumns:

case R.id.list2: 
    recordsCursor = dbHelper.fetchRecords2(); 
    String[] from = new String[]{DbAdapter.KEY_W_SENDER}; 
    int[] to = new int[]{R.id.text1}; 
    Log.i(TAG, "count: "+recordsCursor.getCount()); // returns 0 
    adapter.changeCursorAndColumns(recordsCursor, from, to); 
    adapter.notifyDataSetChanged(); 
    return true; 

Следует также отметить, что the constructor you're using является устаревшим с API 11:

Этот конструктор осуждался в уровне API 11.
Этот параметр не рекомендуется, так как это приводит к тому, что запросы курсора выполняются в потоке пользовательского интерфейса приложения и, следовательно, могут вызывать слабую отзывчивость или даже приложение N ot Ответы на ошибки. В качестве альтернативы используйте LoaderManager с помощью CursorLoader.

+0

Большое спасибо. Я пытался использовать 'setListAdapter', и после переключения обратно в list1 он терпел неудачу. Но он отлично работает с 'changeCursorAndColumns'. –

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