我刚刚使用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(由Scrumptius fb教程设计)每次打开朋友选择器时都会调用onCreate。。。可能会强制重新加载数据。有人有将其付诸实践的经验吗?我此刻被难住了。提前谢谢。
要理解这个回答,你需要阅读我在上面原始问题下的评论。
我发现:当您将Facebook的FriendPickerFragment
更改为类型FriendPickerType.TAGGABLE_FRIENDS
时,返回的数据设置为不缓存。这意味着,每次显示好友选择器时,都会重新加载数据,由于某种原因,这会导致在重新加载完成后,任何先前选择的好友都不会被重新选择。我仍然不确定为什么会这样,因为FriendPickerFragment似乎仍然通过它的preSelectedFriendIds List<String>
对象引用了那些选定的朋友(所以更好的解决方案可能是确定为什么会发生这种情况)。此外,如果您更改FriendPickerType.TAGGABLE_FRIENDS
以允许缓存,当您重新启动FriendPickerFragment时,您会立即看到您以前选择的朋友实际上是被选中的,但随后FriendPickerCFragment意识到它从缓存中加载了数据(即使只有一些),这会导致它刷新数据!再次重置之前选择的好友!
我所做的解决方法:这可能不是最好的方法,因为我相信Facebook让FriendPickerType.TAGGABLE_FRIENDS
不可缓存是有原因的。我最初的想法是,这是因为如果它从缓存中加载,它可能并不总是包含用户的完整朋友列表,或者可能只是要缓存的很多朋友(数据)。但是,我将类型切换为可缓存。然后,我向FriendPickerFragment添加了一个boolean
,指示这是否是第一次加载数据。如果你遵循Facebook教程,你会看到他们使用一个名为populateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar, boolean initialLoad)
的静态方法来设置FriendPickerFragment。在启动FriendPicker之前,我会检查我的启动活动中是否已经显示了FriendPickers。如果没有,我将initialLoad布尔值设置为true,否则,如果已经显示,我将初始布尔值设为false。此布尔值控制在Facebook的FriendPickerFragment私有类ImmediateLoadingStrategy
:下找到的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)确保如果这是第一次显示好友选取器,则会更新好友列表;(b)如果在应用程序运行期间已经显示过一次,则不会刷新。这样可以确保先前选择的好友保持选中状态。
如果有人有更好的解决方案,我很乐意听到:)