1

Я только что реализовал подборщик друзей, используя предоставленный вами SDK для Android от Android. Кажется, что все работает отлично, за исключением того, что пользователь хочет вернуться в сборщик и отредактировать свой выбор друзей. Я могу получить ранее выбранных друзей и вызвать setSelection в friendPickerFragment (который получает объект List, подтвержденный через Log.d). Однако, друзья НЕ выбраны! В моем PickerActivity я звоню:Android - Facebook SDK - FriendPicker setSelected not working

@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 вызывается каждый раз, когда я открываю подборщик друзей ... вероятно, вызывая перезагрузку данных. У кого-нибудь есть опыт, чтобы это работало? Я в тупике. Заранее спасибо.

+0

Я нашел [нить] (http://stackoverflow.com/a/23371788/1542275), который показывает, что именно я но я не могу получить никаких избранных друзей. Тем не менее я могу видеть, что 'public void setSelectionByIds (List userIds)' метод обрабатывает отправленные пользователем userIds. Просто не уверен, почему пользовательский интерфейс не работает. – Warblr

+0

ОК, поэтому я проследил все это до класса facebook sdk 'PickerFragment', где я вижу, что правильные userIds правильно переключаются:' @Override void toggleSelection (String id) 'Но почему пользовательский интерфейс (т.е. флажки ListItem), не обновляющие ???? !!!!! Что происходит после 'selectedIds.add (id);' чтобы сообщить об обновлении пользовательского интерфейса? – Warblr

+0

Я добавил Facebooks FriendPickerSample в мое рабочее пространство, запустил его, и он работает так, как ожидалось, с выбранными ранее избранными пользователями, которые были выбраны ... Я пробовал его реализацию, но не повезло. Я замечаю, что мой savedInstanceState имеет значение null каждый раз, когда я запускаю сборщик, поэтому я предполагаю, что это связано с проблемой, поскольку я каждый раз создаю новый сборщик ... – Warblr

ответ

2

Чтобы понять этот ответ, вам нужно будет прочитать мои комментарии по оригинальному вопросу выше.

То, что я нашел: При изменении на Facebook FriendPickerFragment ввести FriendPickerType.TAGGABLE_FRIENDS возвращаемые данные установки не кэшировать. Это означает, что каждый раз, когда отображается подборщик друзей, данные перезагружаются, что по какой-то причине приводит к тому, что любые ранее выбранные друзья не могут быть повторно выбраны после завершения перезагрузки. Я все еще не уверен, почему это так, потому что похоже, что FriendPickerFragment по-прежнему ссылается на этих избранных друзей через объект preSelectedFriendIds List<String> (поэтому лучшим решением может быть определение, почему это происходит). Кроме того, если вы изменили FriendPickerType.TAGGABLE_FRIENDS, чтобы разрешить кеширование, когда вы повторно запускаете FriendPickerFragment, вы на мгновение увидите, что выбранные вами ранее друзья были выбраны на самом деле, но затем FriendPickerFragment понимает, что он загружал данные (даже если только некоторые) из кеша, что заставляет его обновлять свои данные! Снова сбросьте ранее выбранных друзей!

Что я сделал, чтобы обойти: Это, возможно, не лучший способ пойти об этом, так как я уверен, что Facebook сделал FriendPickerType.TAGGABLE_FRIENDS нон Кэширование по причине. Мое первоначальное мышление заключается в том, что это связано с тем, что если он загружается из кеша, он может не всегда содержать список пользователей, полный список друзей, или, возможно, это просто много друзей (данных) для кеширования. Однако я переключил тип на кешируемый. Затем я добавил boolean в FriendPickerFragment, который указывает, загружен ли первый раз, когда данные были загружены. Если вы будете следовать учебнику Facebook, вы увидите, что они настраивают FriendPickerFragment, используя статический метод с именем populateParameters(Intent intent, String userId, boolean multiSelect, boolean showTitleBar, boolean initialLoad). Перед запуском FriendPicker я проверяю свою начальную активность, если FriendPicker уже показан или нет. Если это не так, я устанавливаю initialLoad boolean в true, иначе, если он уже был показан, я устанавливаю начальное логическое значение в false. Это логическое управление методом onLoadFinished() найден в FriendPickerFragment Facebook под частным класса 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 - это (а) убеждается, что если это первый раз, когда friendpicker показано друзей список обновляется и (б) если он уже был показан один раз во время этого запуска приложения, он не обновляется. Это гарантирует, что выбранные ранее друзья остаются выбранными.

Если кто-то имеет лучшее решение, которое я хотел бы услышать это :)