如何自定义要在FriendPickerFragment中显示的用户列表

时间:2013-06-18 10:31:24

标签: android facebook

我在使用Facebook SDK的应用程序上工作。我在我的应用中集成了Facebook SDK。我试图为登录用户显示Facebook好友。我不想向用户展示他所有的Facebook好友,只有那些符合某个标准的人。我设法选择了这些Facebook好友,但无法显示它们。 有没有办法自定义显示Facebook好友? 在我的代码中,为了获取我用户选择的所有Facebook用户://朋友uri。我还尝试将某些用户ID传递给该Uri,但没有成功。是否有人通过Facebook Ids来挑选://朋友所以我可以展示某些朋友,或者这个方向是错的?

先谢谢你的帮助。 亚历

1 个答案:

答案 0 :(得分:0)

这是一个老问题,但我找不到其他试图这样做的人。通过覆盖图形请求及其处理程序,我能够将FriendPickerFragment子类化为指定用户ID。它有点hacky但似乎有用。

// Has to be in this package so we can access package-private members on the superclass.
package com.facebook.widget;

import android.os.Bundle;
import android.text.TextUtils;

import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.model.GraphObject;
import com.facebook.model.GraphUser;

import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by Derek on 1/11/2015.
 */
public class MyFriendPickerFragment extends FriendPickerFragment {
    private List<String> userIds;

    public void setUserIds(List<String> userIds) {
        this.userIds = userIds;
    }

    @Override
    Request getRequestForLoadData(Session session) {
        if (userIds == null) {
            return super.getRequestForLoadData(session);
        } else {
            return createRequest(extraFields, session);
        }
    }

    private Request createRequest(Set<String> extraFields, Session session) {
        Request request = Request.newGraphPathRequest(session, "", null);

        Set<String> fields = new HashSet<String>(extraFields);
        String[] requiredFields = new String[]{
                "id",
                "name"
        };
        fields.addAll(Arrays.asList(requiredFields));

        String pictureField = adapter.getPictureFieldSpecifier();
        if (pictureField != null) {
            fields.add(pictureField);
        }

        Bundle parameters = request.getParameters();
        parameters.putString("fields", TextUtils.join(",", fields));
        parameters.putString("ids", TextUtils.join(",", userIds));
        request.setParameters(parameters);

        return request;
    }

    @Override
    public void loadData(boolean forceReload) {
        if(userIds == null) {
            super.loadData(forceReload);
        } else {
            Request request = getRequestForLoadData(getSession());
            request.setCallback(
                    new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            if (response.getError() == null) {
                                Map<String, Object> map = response.getGraphObject().asMap();
                                final List<GraphUser> users = new ArrayList<>();
                                for (Map.Entry<String, Object> entry : map.entrySet()) {
                                    JSONObject jsonObject = (JSONObject)entry.getValue();
                                    GraphUser user = GraphObject.Factory.create(jsonObject, GraphUser.class);
                                    users.add(user);
                                }

                                adapter.changeCursor(new GraphObjectCursor<GraphUser>() {
                                    private int position = 0;

                                    @Override
                                    public boolean isFromCache() {
                                        return false;
                                    }

                                    @Override
                                    public boolean areMoreObjectsAvailable() {
                                        return position < getCount() - 1;
                                    }

                                    @Override
                                    public int getCount() {
                                        return users.size();
                                    }

                                    @Override
                                    public int getPosition() {
                                        return position;
                                    }

                                    @Override
                                    public boolean move(int offset) {
                                        return moveToPosition(position + offset);
                                    }

                                    @Override
                                    public boolean moveToPosition(int newPosition) {
                                        if (newPosition >= 0 && newPosition < getCount()) {
                                            position = newPosition;
                                            return true;
                                        }
                                        return false;
                                    }

                                    @Override
                                    public boolean moveToFirst() {
                                        position = 0;
                                        return true;
                                    }

                                    @Override
                                    public boolean moveToLast() {
                                        position = getCount() - 1;
                                        return true;
                                    }

                                    @Override
                                    public boolean moveToNext() {
                                        return move(1);
                                    }

                                    @Override
                                    public boolean moveToPrevious() {
                                        return move(-1);
                                    }

                                    @Override
                                    public boolean isFirst() {
                                        return position == 0;
                                    }

                                    @Override
                                    public boolean isLast() {
                                        return position == getCount() - 1;
                                    }

                                    @Override
                                    public boolean isBeforeFirst() {
                                        return position < 0;
                                    }

                                    @Override
                                    public boolean isAfterLast() {
                                        return position >= getCount();
                                    }

                                    @Override
                                    public GraphUser getGraphObject() {
                                        return users.get(position);
                                    }

                                    @Override
                                    public void close() {
                                    }

                                    @Override
                                    public boolean isClosed() {
                                        return false;
                                    }
                                });
                            }
                        }
                    }
            );
            request.executeAsync();
        }
    }
}