Android - Facebook SDK - FriendPicker setSelected not workin



我刚刚使用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)如果在应用程序运行期间已经显示过一次,则不会刷新。这样可以确保先前选择的好友保持选中状态。

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

相关内容

  • 没有找到相关文章

最新更新