sqliteデータベースのさまざまなテーブルのデータを、さまざまな時点で単一のListViewに反映したいと考えています。
最初のクエリは正常に機能します。これは次のようになります。
AutoCursorAdapter extends CursorAdapter
Cursor から任意のデータを表示できる カスタム 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 の基礎となる DB に反映された変更に関するものではありません。これは、NotifyChange メカニズムを介して UI で正しく更新されます。この質問は、基になるクエリの性質を完全に変更することに関するものです。