6

ViewPagerを含むFragmentActivityがあります-このViewPagerには3つのListViewが含まれています-それぞれが独自のアダプター(および固有のデータセット)を持つように設定されています。

AsyncTaskLoaderを使用してこれらのアダプターにデータを入力したいのですが、ViewPagerで特定のビューが選択されている場合に限ります。

アクティビティのonCreateメソッドでローダーを初期化する必要がありますか?(以下のコード)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_foo);

    getSupportLoaderManager().initLoader(0, null, this);
    getSupportLoaderManager().initLoader(1, null, this);
    getSupportLoaderManager().initLoader(2, null, this);
}

または、OnPageChangeListener.onPageSelectedのリスナーの結果など、呼び出しinitLoader(...)をインタラクティブに呼び出しても問題ありませんか?

mPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int newPage) {
        getSupportLoaderManager().initLoader(newPage, null, this);
    }

    ...
}

ユーザーがページャーの最初のビューしか見ることができない場合は、時間のかかる可能性のある3つのローダーを前もって実行する必要はありません。

編集: または、ViewPagerに各ビューにフラグメントを使用させ、各フラグメントが独自のローダーの管理を担当するようにする方が良い設計でしょうか?

4

2 に答える 2

1

詳細は覚えていませんが、少なくとも互換性ライブラリでは、initLoader()から呼び出さないとonCreate()、ローダーのライフサイクルが混乱するため、から呼び出すことをお勧めしますonCreate()(最新バージョンでは修正されている可能性があります)。 tテスト済み)。IIRC、フラグメントはアクティビティのLoaderManagerを使用するだけなので、ローダーは常にアクティビティによって管理されます。フラグメントを使用すると、通常、コードがよりクリーンになるため、可能であればフラグメントに移行してください。

于 2011-11-18T03:03:16.733 に答える
1

すでにフラグメントを使用しているので、ビューページャーでフラグメントを使用することをお勧めします。私はそうします、そしてそれはずっと良く働きます。次に、実際にフラグメントごとに1つのローダーを初期化します。これらのフラグメントが関連している場合は、抽象拡張を定義し、そこに共通の初期化ロジックを配置できます。次に、それを拡張して具体的なフラグメントを作成できます。

上記のコードで、後続の各ローダーを初期化すると、IDが異なっていても、前のローダーの実行がキャンセルされることがわかりました。

于 2011-11-18T03:07:18.063 に答える