9

最初に、下位互換性のために ActionBarSherlock ライブラリを使用していることに言及する必要があります。

ListFragment最初に開始したときにを追加するアクティビティがあります。Loader私が実装したカスタムがあり、 AsnycTaskLoader の例に非常に厳密に従っています。私ListFragmentのインターフェイスを実装しLoaderCallbacks<Cursor>ます。onCreateLoader()フラグメントが追加されたとき ( 、onLoaderFinished())、置き換えられたとき ( )に、適切なすべてのコールバック メソッドが呼び出されますonLoaderReset()

私のonActivityCreated(Bundle)方法は次のようになります。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mAccountsDbAdapter = new AccountsDbAdapter(getActivity().getApplicationContext());

    setHasOptionsMenu(true);
    mCursorAdapter = new AccountsCursorAdapter(getActivity()
            .getApplicationContext(), R.layout.list_item_account, null,
            new String[] { DatabaseHelper.KEY_NAME },
            new int[] { R.id.account_name }, 0);

    setListAdapter(mCursorAdapter); 
    getLoaderManager().initLoader(0, null, this);
}

その後、ListFragment別の Fragment B に置き換えられます。ユーザーが [戻る] ボタンを押すと、Fragment B が削除され、ListFragment が再び追加されます。ただし、リストは空で、android:empty要素のみが表示され、LoaderCallback メソッドは呼び出されません。デバッガーを使用して、それgetLoaderManager().initLoader(0, null, this);が実際に呼び出されているかどうかを判断できますが、他には何もありません。に変更するとgetLoaderManager().restartLoader(0, null, this);、コールバックが呼び出されますが、リストは空のままです (データはありますが、ビューは更新されません)。

ListFragment がレイアウトに返されたときに更新するにはどうすればよいですか? 以前にこれに遭遇した人はいますか?どのように修正しましたか?

参考までに、ここに私のコールバックメソッドがあります

    @Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new AccountsCursorLoader(this.getActivity()
            .getApplicationContext());
}

@Override
public void onLoadFinished(Loader<Cursor> loaderCursor, Cursor cursor) {
    mCursorAdapter.swapCursor(cursor);
    mCursorAdapter.notifyDataSetChanged();
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    mCursorAdapter.swapCursor(null);
}

いくつかのメモ:

  1. カスタム コンテンツ ビューでは使用できないというメッセージが表示されるsetListShown(true)ため、この例のメソッドは使用できません。IllegalStateException
  2. MyAccountsCursorAdapterは aを拡張し、メソッドSimpleCursorAdapterのみを変更します。bindView()
4

7 に答える 7

5

ユーレカ!!!見つけました(もちろん偶然)

TL;DR;

AccountsListFragmentで、メソッド内にデータベース アダプタ ( AccountsDatabaseAdapter) を作成し、onCreate()メソッド内でそれを閉じると、onDestroy()機能するようになりました。以前は でアダプターを作成し、onActivityCreated()で閉じていましたonDestroyView()ListAdapterのことではなく、データベース インターフェースのことを指していることに注意してくださいAccountsDbAdapter

長い説明を試みます:

getActivity()まあ、私がこれをしていたのは、メソッドでコンテキストを取得することはできないと思ったからonCreate()です。が呼び出されるgetActivity()前でもできることがわかりました。onActivityCreated()

Loaderしかし、データを取得するために使用する独自のDatabaseAdapterオブジェクトがあるため、これが機能する理由を実際に説明することはできません。推測すると、両方のデータベース アダプタに対して同じデータベース オブジェクトが返されると言えます (データベースはキャッシュされます)。つまり、 で 1 つを閉じるonDestroyView()と、もう 1 つも閉じられ、カーソル データ セットが無効になり、空のリスト ビューが表示されます。データが変更されていないと見なされるため、ローダーはリロードしません。

しかし、この説明でさえ私を完全に満足させるものではありません。なぜなら、毎回ローダーを強制的に再起動するなど、ここで試したいくつかの提案された解決策が機能しなかったからです。(メソッドでは、毎回loadInBackground()新しいが作成されます)。DatabaseAdapter

とにかく、何が起こっているのかをよりよく理解している場合は、コメントを残してください.

これを手伝ってくれてありがとう!

于 2012-06-14T21:37:35.587 に答える
2

基になるデータ セットが変更された直後に、アクティビティでローダーを強制的に再起動しようとしましたか?

試す:

getLoaderManager().restartLoader(0, null, this);
于 2012-07-18T22:42:03.540 に答える
1

forceload() を試してください:

getLoaderManager().getLoader( 0 ).forceLoad();
于 2012-06-08T13:25:46.503 に答える
0

私の場合、何らかの理由で ListView が単に画面に描画されていないことがわかりました。ホーム画面に移動してからアクティビティに戻ると、すべてが期待どおりに表示されます。そこで、画面を強制的に再描画する方法を探したところ、次のことがわかりました。

再開時に全画面アクティビティを強制的に再測定/再描画しますか?

その質問への回答に基づいてonActivityCreated()、ListFragment のメソッドに次のコードを追加しました。

getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 0);

このコードを配置すると、すべてが期待どおりに機能します。しかし、これはまだ回避策であるため、誰かがこの質問に対してより良い解決策または説明を提供してくれたら、報奨金を授与します.

于 2012-06-04T15:48:00.170 に答える
0

問題はgetLoaderManager()、コールバックが正しい場所に送信されないことに起因する可能性があります。

ActionBarSherlock を使用している場合は、Android 2.x を使用していることになります。Android サポート パッケージ v4 の使用を検討しましたか? http://developer.android.com/sdk/compatibility-library.html

次に、呼び出して使用android.support.v4.app.ListFragmentして取得しますLoaderManagergetActivity().getSupportLoaderManager()

于 2012-06-09T11:09:17.880 に答える
0

カスタム ローダーを使用しているので、ネイティブの CursorLoader を使用するときに同じ問題があるかどうか知っていますか? そうでない場合は、おそらく、ローダーと Android ソースを比較して、何か違うことを行っているかどうかを確認できますか?

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/CursorLoader.java

于 2012-06-09T11:19:20.570 に答える