この回答を理解するには、上記の元の質問の下にある私のコメントを読む必要があります。
私が見つけたもの: Facebook のFriendPickerFragment
タイプを変更FriendPickerType.TAGGABLE_FRIENDS
すると、返されるデータはキャッシュされないように設定されます。これは、フレンド ピッカーが表示されるたびにデータがリロードされることを意味します。これにより、何らかの理由で、以前に選択したフレンドがリロードの完了後に再選択されなくなります。FriendPickerFragment は、preSelectedFriendIds List<String>
オブジェクトを介して選択された友人を参照しているように見えるため、その理由はまだわかりません (したがって、より良い解決策は、それが起こっている理由を特定することです)。さらに、FriendPickerType.TAGGABLE_FRIENDS
キャッシングを許可するために、FriendPickerFragment を再起動すると、以前に選択したフレンドが実際に選択されていることが瞬間的にわかりますが、FriendPickerFragment は、キャッシュからデータ (一部のみであっても) をロードしたことを認識するため、データが更新されます! もう一度、以前に選択した友達をリセットします!
回避策として私が行ったこと:FriendPickerType.TAGGABLE_FRIENDS
Facebook が何らかの理由でキャッシュ不可にしたと確信しているため、これはおそらく最善の方法ではありません。私の最初の考えは、キャッシュからロードしている場合、ユーザーの完全な友達リストが常に含まれているとは限らないか、キャッシュするのが単にたくさんの友達 (データ) であるということです。ただし、タイプをキャッシュ可能に切り替えました。次にboolean
、データが初めて読み込まれたかどうかを示す を FriendPickerFragment に追加しました。Facebook のチュートリアルに従うと、彼らが FriendPickerFragment という名前の静的メソッドを使用してセットアップしていることがわかります。populateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar, boolean initialLoad)
. FriendPicker を起動する前に、FriendPicker が既に表示されているかどうかを起動アクティビティで確認します。まだ表示されていない場合は、initialLoad ブール値を true に設定します。それ以外の場合は、初期値ブール値を false に設定します。このブール値は、プライベート クラスの下にある Facebook の FriendPickerFragment にある onLoadFinished() メソッドを制御しますImmediateLoadingStrategy
。
private class ImmediateLoadingStrategy extends LoadingStrategy {
@Override
protected void onLoadFinished(GraphObjectPagingLoader<GraphUser> loader, SimpleGraphObjectCursor<GraphUser> data) {
super.onLoadFinished(loader, data);
// We could be called in this state if we are clearing data or if we are being re-attached
// in the middle of a query.
if (data == null || loader.isLoading()) {
return;
}
if (data.areMoreObjectsAvailable()) {
// We got results, but more are available.
followNextLink();
} else {
// We finished loading results.
hideActivityCircle();
// If this was from the cache, schedule a delayed refresh query (unless we got no results
// at all, in which case refresh immediately.
if (data.isFromCache() && initialLoad==true) {
loader.refreshOriginalRequest(data.getCount() == 0 ? CACHED_RESULT_REFRESH_DELAY : 0);
}
}
}
}
追加されたチェックに注意してください。&& initialLoad==true
これにより、(a) フレンドピッカーが初めて表示された場合にフレンド リストが更新され、(b) アプリの実行中に既に一度表示されている場合は更新されません。これにより、以前に選択した友人が選択されたままになります。
誰かがより良い解決策を持っているなら、私はそれを聞きたいです:)