Android - Facebook SDK - FriendPicker setSelected无效

时间:2014-09-09 10:06:49

标签: android facebook facebook-graph-api multi-friend-selector

我刚刚使用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 ...可能会强制重新加载数据。有没有人有这方面的工作经验?我此刻难过。提前谢谢。

1 个答案:

答案 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)如果在此期间已经显示了一次该应用程序,它没有刷新。这可确保以前选择的朋友保持选中状态。

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