1

我刚刚使用 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(由 Scrumptious fb 教程设计)每次打开朋友选择器时都会调用 onCreate ......可能会强制重新加载数据。有没有人有让这个工作的经验?我现在很难过。提前致谢。

4

1 回答 1

2

要理解此回复,您需要阅读我在上述原始问题下的评论。

我发现:当您更改 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) 如果在此应用程序运行期间已经显示过一次,则不会刷新。这确保了之前选择的朋友仍然被选中。

如果有人有更好的解决方案,我很乐意听到:)

于 2014-09-10T18:58:04.607 回答