1

Facebook が提供する Android 用の SDK を使用して、フレンド ピッカーを実装しました。ユーザーがピッカーに戻って友人の選択を編集したい場合を除いて、すべてが正常に機能しているようです。以前に選択した友達を取得し、friendPickerFragment で setSelection を呼び出すことができます (Log.d で確認された List オブジェクトを受け取ります)。ただし、フレンドは事前抽選ではありません!! 私の 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);
        }
    }
}

おそらくloadDataの呼び出しが選択を一掃していると考えて、setSelectionのみを呼び出してみましたが、それでもうまくいきません。また、PickerActivity (Scrumptious fb チュートリアルで設計されたもの) の場合、フレンド ピッカーを開くたびに onCreate が呼び出されることにも気付きました...データのリロードを強制する可能性があります。これを機能させた経験のある人はいますか?私は今のところ困惑しています。前もって感謝します。

4

1 に答える 1

2

この回答を理解するには、上記の元の質問の下にある私のコメントを読む必要があります。

私が見つけたもの: Facebook のFriendPickerFragmentタイプを変更FriendPickerType.TAGGABLE_FRIENDSすると、返されるデータはキャッシュされないように設定されます。これは、フレンド ピッカーが表示されるたびにデータがリロードされることを意味します。これにより、何らかの理由で、以前に選択したフレンドがリロードの完了後に再選択されなくなります。FriendPickerFragment は、preSelectedFriendIds List<String>オブジェクトを介して選択された友人を参照しているように見えるため、その理由はまだわかりません (したがって、より良い解決策は、それが起こっている理由を特定することです)。さらに、FriendPickerType.TAGGABLE_FRIENDSキャッシングを許可するために、FriendPickerFragment を再起動すると、以前に選択したフレンドが実際に選択されていることが瞬間的にわかりますが、FriendPickerFragment は、キャッシュからデータ (一部のみであっても) をロードしたことを認識するため、データが更新されます! もう一度、以前に選択した友達をリセットします!

回避策として私が行ったこと:FriendPickerType.TAGGABLE_FRIENDS Facebook が何らかの理由でキャッシュ不可にしたと確信しているため、これはおそらく最善の方法ではありません。私の最初の考えは、キャッシュからロードしている場合、ユーザーの完全な友達リストが常に含まれているとは限らないか、キャッシュするのが単にたくさんの友達 (データ) であるということです。ただし、タイプをキャッシュ可能に切り替えました。次にboolean、データが初めて読み込まれたかどうかを示す を FriendPickerFragment に追加しました。Facebook のチュートリアルに従うと、彼らが FriendPickerFragment という名前の静的メソッドを使用してセットアップしていることがわかります。populateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar, boolean initialLoad). FriendPicker を起動する前に、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 に答える