我刚刚使用Facebook为Android提供的SDK实现了朋友选择器。一切似乎工作得很好,除非用户想要回到选择器并编辑他们的朋友选择。我能够获得之前选择的朋友,并在friendPickerFragment上调用setSelection(它接收List对象,通过Log.d确认)。但是,朋友们没有被预选!在我的PickerActivity中,我打电话:
@Override
protected void onResume() {
super.onResume();
if (FRIEND_PICKER.equals(getIntent().getData())) {
Log.d(LOG, "HERE");
try {
if (selectedFriends()!=null) {
Log.d(LOG, "U HAVE FRIENDS: " + selectedFriends().size());
friendPickerFragment.setSelection(selectedFriends());
}
friendPickerFragment.setFriendPickerType(FriendPickerType.TAGGABLE_FRIENDS);
friendPickerFragment.loadData(false);
} catch (Exception ex) {
onError(ex);
}
}
}
我也尝试过只调用setSelection,认为对loadData的调用可能会消除选择......但仍然没有运气。我也注意到我的PickerActivity(由美味的fb教程设计)每次打开朋友选择器时都会调用onCreate ...可能会强制重新加载数据。有没有人有这方面的工作经验?我此刻难过。提前谢谢。
答案 0 :(得分:2)
要了解此回复,您需要阅读上述原始问题的评论。
我发现的内容:当您将Facebook的FriendPickerFragment
更改为FriendPickerType.TAGGABLE_FRIENDS
时,返回的数据将被设置为不会被缓存。这意味着每次显示朋友选择器时都会重新加载数据,这会导致在重新加载完成后不再重新选择任何先前选择的朋友。我仍然不确定为什么会这样,因为似乎FriendPickerFragment仍然通过它的preSelectedFriendIds List<String>
对象引用那些选定的朋友(所以更好的解决方案可能是确定为什么会发生这种情况)。此外,如果您更改FriendPickerType.TAGGABLE_FRIENDS
以允许缓存,当您重新启动FriendPickerFragment时,您会立即看到您之前选择的朋友实际上已被选中,但随后FriendPickerFragment意识到它已加载数据(即使只有一些)缓存,导致它刷新它的数据!再次,重置以前选择的朋友!
我采取了哪些措施来解决这个问题:这可能不是解决这个问题的最佳方式,因为我确信Facebook因为某种原因而使FriendPickerType.TAGGABLE_FRIENDS
无法缓存。我最初的想法是,因为如果从缓存加载它可能并不总是包含用户的完整朋友列表,或者可能只是很多朋友(数据)要缓存。但是,我将类型切换为可缓存。然后我在FriendPickerFragment中添加了一个boolean
,指示这是否是第一次加载数据。如果您按照Facebook教程,您会看到他们使用名为populateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar, boolean initialLoad)
的静态方法设置了FriendPickerFragment。在启动FriendPicker之前,如果已经显示了FriendPicker,我会检查我的启动活动。如果没有我将initialLoad布尔值设置为true,否则如果已经显示它我将初始布尔值设置为false。这个布尔值控制在私有类ImmediateLoadingStrategy
下Facebook的FriendPickerFragment中找到的onLoadFinished()方法:
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)确保如果这是第一次显示friendpicker,则更新朋友列表,以及(b)如果在此期间已经显示了一次该应用程序,它没有刷新。这可确保以前选择的朋友保持选中状态。
如果某人有更好的解决方案,我很乐意听到它:)