我只是使用Facebook提供的Android的SDK实现了朋友选择器。除了用户是否想返回选择器并编辑其好友选择之外,其他所有内容似乎都正常运行。我可以获取以前选择的朋友,并在friendPickerFragment(接收通过Log.d确认的List对象)上调用setSelection。但是,不会预先选择朋友!!在我的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……可能会强制重新加载数据。有没有人有使它工作的经验?此刻我很沮丧。提前致谢。

最佳答案

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

我的发现:当您将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)如果在此应用程序运行期间已经显示一次,则为不刷新。这样可以确保先前选择的朋友保持选中状态。

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

10-08 03:02