1

我想在单个 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 实例执行此操作吗?

    1. 如果有怎么办?例如CursorLoader.setUri()不会触发重新加载。
    2. 如果没有,我该如何正确管理多个加载器实例?
  • 这是装载机可能不是可行的方法吗?

注意:问题在于表 A 中底层数据库的反映变化。这已经通过 NotifyChange 机制在 UI 中正确更新。这个问题是关于完全改变底层查询的性质。

4

1 回答 1

0

我可以使用单个 Loader 实例执行此操作吗?

我不会推荐它。Cursor加载器有足够的状态,试图像这样显着改变它们可能会很麻烦,并且当它们都返回相同的数据类型(例如, )时,拥有多个加载器并不是什么大不了的事。

如果没有,我该如何正确管理多个加载器实例?

为它们使用不同的 ID(第二个参数 on ),并根据 IDinitLoader()创建权限LoaderonCreateLoader()

于 2012-09-09T15:26:25.957 回答