要理解此回复,您需要阅读我在上述原始问题下的评论。
我发现:当您更改 FacebookFriendPickerFragment
以键入FriendPickerType.TAGGABLE_FRIENDS
返回的数据时,设置为不被缓存。这意味着每次显示朋友选择器时都会重新加载数据,这会由于某种原因导致在重新加载完成后不会重新选择任何先前选择的朋友。我仍然不确定为什么会这样,因为 FriendPickerFragment 似乎仍然通过它的preSelectedFriendIds List<String>
对象引用那些选定的朋友(因此更好的解决方案可能是确定为什么会发生这种情况)。此外,如果您更改FriendPickerType.TAGGABLE_FRIENDS
为了允许缓存,当您重新启动 FriendPickerFragment 时,您会暂时看到您之前选择的朋友实际上已被选中,但随后 FriendPickerFragment 意识到它从缓存中加载了数据(即使只有一些),这会导致它刷新它的数据!再次,重置之前选择的朋友!
我所做的解决方法:这可能不是解决此问题的最佳方法,因为我确信 Facebook 将FriendPickerType.TAGGABLE_FRIENDS
不可缓存设置为有原因。我最初的想法是,这是因为如果它是从缓存中加载的,它可能并不总是包含用户的完整朋友列表,或者可能只是很多朋友(数据)要缓存。但是,我将类型切换为可缓存。然后我boolean
在 FriendPickerFragment 中添加了一个指示这是否是第一次加载数据。如果您遵循 Facebook 教程,您会看到他们使用名为的静态方法设置 FriendPickerFragmentpopulateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar, boolean initialLoad)
. 在启动 FriendPicker 之前,我检查我的启动 Activity 是否已经显示了 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) 如果在此应用程序运行期间已经显示过一次,则不会刷新。这确保了之前选择的朋友仍然被选中。
如果有人有更好的解决方案,我很乐意听到:)