1

sqliteデータベースのさまざまなテーブルのデータを、さまざまな時点で単一のListViewに反映したいと考えています。

最初のクエリは正常に機能します。これは次のようになります。

  • AutoCursorAdapter extends CursorAdapterCursor から任意のデータを表示できる カスタム 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 の基礎となる DB に反映された変更に関するものではありません。これは、NotifyChange メカニズムを介して UI で正しく更新されます。この質問は、基になるクエリの性質を完全に変更することに関するものです。

4

1 に答える 1

0

単一の Loader インスタンスでこれを行うことはできますか?

私はそれをお勧めしません。ローダーには十分な状態があるため、このように大幅に変更しようとするのは面倒かもしれません。また、複数のローダーを使用しても、すべてが同じデータ型 (たとえばCursor) を返す場合、それほど大きな問題ではありません。

そうでない場合、複数のローダー インスタンスを適切に管理するにはどうすればよいですか?

それらに異なる ID を使用し ( の 2 番目のパラメーターinitLoader())、 IDLoaderonCreateLoader()基づいて権限を作成します。

于 2012-09-09T15:26:25.957 に答える