如何保存/恢复附加到 CursorAdapter
的 ListView
的状态?示例:
我有一个带有 3 个 ListView
的 Android Activity
:国家、地区、城市。
它们附加到 3 个 SimpleCursorApdater
:CountryAdapter
、RegionAdapter
、CityAdapter
。
- 选择国家列表中的项目将通过更改
RegionAdapter
的查询条件来过滤区域列表中的项目
- 选择区域列表中的项目将通过更改
CityAdapter
的查询条件来过滤城市列表中的项目
伪代码:
void countryList_onItemSelected() {
regionsAdapter.getFilter().filter(countryId);
}
void regionList_onItemSelected() {
cityAdapter.getFilter().filter(regionId);
}
Cursor regionAdapter_FilterQueryProvider_runQuery(countryId) {
Cursor cur = dbHelper.getReadableDatabase().
query("Select * from Region where countryId = "+countryId);
return cur;
}
Cursor cityAdapter_FilterQueryProvider_runQuery(regionId) {
Cursor cur = dbHelper.getReadableDatabase().
query("select * from City where regionId = "+regionId);
return cur;
}
当 onRestoreInstanceState()
被调用时,cityListView
为空,因为 2 个 runQuery()
方法尚未终止。所以我不能直走:
void onRestoreInstanceState(Bundle state) {
...
savedCitySelection = state.getInt("citySelectedItemPosition")
cityListView.setSelection(savedCitySelection); // <= NOOO! the cityListView is empty
}
问题:
我如何使用 onSaveInstanceState()
和 onRestoreInstanceState() 保存/恢复这 3 个列表的状态。
最佳答案
我建议使用 Loader
。
然后当加载完成并且您交换光标时,您可以在 ListView
上调用 smoothScrollToPosition(int position)
*。
CommonsWare 有一个很好的基于支持库的 CursorLoader:
https://github.com/commonsguy/cwac-loaderex
*(注意:smoothScrollToPosition 需要 Android 2.2)
关于android - SimpleCursorAdapter 的 onRestoreInstanceState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12673712/