我想在单个 ListView 的不同时间反映来自 sqlite 数据库中各种表的数据。
初始查询工作正常,如下所示:
- 我有一个自定义 CursorAdapter 类 (
AutoCursorAdapter extends CursorAdapter
),它可以显示来自游标的任意数据:AutoCursorAdapter.newView()
询问游标并构造对应于列中数据类型的视图。- AutoCursorAdapter.bindView() 从游标中获取数据并填充在 newView 中为游标中的每一行数据创建的视图。
我还在拥有的 Fragment 中实现了一个加载器,如下所示:
public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>{ ... public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... mListView = ((ListView) view.findViewById(R.id.listview)); mAdapter = new AutoCursorAdapter(getActivity()); mListView.setAdapter(mAdapter); return view; } public void onStart() { super.onStart(); // Prepare the loader. Either re-connect with an existing one, // or start a new one. LoaderManager lm = getLoaderManager(); Bundle args = getArguments(); lm.initLoader(LOADER_ID, args, this); } public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader CursorLoader = new CursorLoader(getActivity()); setupLoader(CursorLoader); //Sets the URI, projection etc. depending on app state return CursorLoader; } public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } }
到现在为止还挺好。数据在初始运行时加载。假设它使用 URI_A 从表 A 中提取和显示数据。
但现在的问题是:如何处理我想切换到使用 URI_B 显示表 B 中的数据以响应用户操作的情况?
我可以使用单个 Loader 实例执行此操作吗?
- 如果有怎么办?例如
CursorLoader.setUri()
不会触发重新加载。 - 如果没有,我该如何正确管理多个加载器实例?
- 如果有怎么办?例如
这是装载机可能不是可行的方法吗?
注意:问题不在于表 A 中底层数据库的反映变化。这已经通过 NotifyChange 机制在 UI 中正确更新。这个问题是关于完全改变底层查询的性质。