3

AsyncTaskLoader<List<String>>メンバ変数List<String>mAddressesを持っています。ではloadInBackground、新しいオブジェクトを作成する場合は、それを埋めて返します。onLoadFinished期待どおりに呼び出されるため、アダプターを更新してビューを更新できます。

    public List<String> loadInBackground()
    {
        // ListView updates properly only if I do this (strange?)
        mAddresses = new ArrayList<String>();

        // ... fill mAddresses ...

        return mAddresses;
    }

ただし、値の変更onLoadFinishedが呼び出されても同じ変数を使用しようとすると、次のようになります。

    public List<String> loadInBackground()
    {
        // ListView does not update with this!
        if(mAddresses == null)
        {
           mAddresses = new ArrayList<String>();
        }

        // ... fill mAddresses ...

        return mAddresses;
    }

誰でもこれについてコメントできますか?このように毎回返す新しいオブジェクトを作成することになっていますか? 「オブジェクトが変更されたため、同じオブジェクトであっても、すべての更新が実行されていることを確認してください」というフラグを設定できますか?

4

2 に答える 2

6

データがすでにロードされている場合 (Loader にある 'mAddresses' 変数のように)、 forceLoad() を呼び出して再度ロードする必要があります。

http://developer.android.com/reference/android/content/Loader.html#forceLoad%28%29



編集: ...いくつかの調査の後...元の質問に答えるには、役に立たない:「そうではないから」!

LoaderManager のソースから:

        // Notify of the new data so the app can switch out the old data before
        // we try to destroy it.
        if (mData != data || !mHaveData) {
            mData = data;
            mHaveData = true;
            if (mStarted) {
                callOnLoadFinished(loader, data);
            }
        }

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/app/LoaderManager.java#LoaderManagerImpl.LoaderInfo.onLoadComplete%28android.content .Loader%2Cjava.lang.Object%29

RE あなたの問題です。クリアしてやり直すのではなく、loadInBackground() のリストに継続的に追加していると思います。最もクリーンな方法は、既存の List を引数として ArrayList() コンストラクターに渡すことにより、毎回新しい ArrayList を作成することです。これにより、内容がコピーされます。
または、deliverResult() をオーバーライドすることもできます。これはメイン スレッドから呼び出されるため、mAdapter を変更しても問題ありません。
または、ローダーを忘れて、はるかに単純な AsyncTask を使用するだけです...ただし、データが実際にどこから来るかによって異なります。

于 2013-09-24T13:36:58.427 に答える
1

onStartLoading をオーバーライドして forceLoad() を呼び出してみてください

@Override
protected void onStartLoading() {
    super.onStartLoading();
    forceLoad();
}

@Override
protected void onStopLoading() {
    super.onStopLoading();
    cancelLoad();
}
于 2016-08-31T14:43:02.397 に答える