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
不鼓励使用此选项,因为它导致在应用程序的UI线程上执行游标查询,因此可能导致响应性较差,甚至导致应用程序N ot响应错误。作为替代,使用带有CursorLoader的LoaderManager。

+0

非常感谢。我试过使用'setListAdapter',它在切换回list1后失败。但是'changeCursorAndColumns'可以很好地工作。 –