2015-10-04 3 views
2

Я живу от одного RecyclerView с GridLayout к другому. Он отображает изображения, подобные галерее.Активность Переход между двумя RecyclerViews

RecyclerView Родитель показывает первые 3 элемента папки, ребенок RecyclerView показывает полное содержание в сетке ...

главный адаптер

@Override 
public void onBindViewHolder(FolderViewHolder holder, int position) { 
    holder.transitionPairs.clear(); 
    for (int i = 0; i < 3; i++) { 
     ImageView iv = holder.getIconView(i); 
     Image image = mItems.get(position).getImages().get(i); 
     holder.transitionPairs.add(new Pair(iv, image.getTransitionName())); 
    } 

ребенка адаптер

@Override 
public void onBindViewHolder(ImageViewHolder holder, int position) { 

    ViewCompat.setTransitionName(holder.icon, mItems.get(position).getTransitionName()); 
} 
  • оба адаптера установите ЖЕ имя перехода, он генерируется из Ури изображения, так что это, безусловно, уникальный

я начинаю вид ребенка, как следующее:

Intent intent = new Intent(getActivity(), ImagesActivity.class); 
     intent.putExtra("folderIndex", pos); 
     intent.putExtra("folder", item); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
      ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), vh.getTransitionPairs().toArray(new Pair[vh.getTransitionPairs().size()])); 
      getActivity().startActivity(intent, options.toBundle()); 
     } 
     else 
      getActivity().startActivity(intent); 

Пары переходов сохраняются в ViewHolder и генерируются всякий раз, когда ViewHolder связано, как вы можете видеть в ViewHolders коде выше

ПРОБЛЕМА

Отображение детского вида не анимировано, анимируется ...

ответ

3

извините, но это документированное ограничение структуры перехода.

https://developer.android.com/intl/es/training/transitions/overview.html#Limitations

Ограничение

В этом разделе перечислены некоторые известные ограничения рамок переходов: - классы, которые расширяют AdapterView, такие как ListView, управлять их дочерними представлениями способов, которые несовместимы с переходами фреймворк. Если вы пытаетесь анимировать представление на основе AdapterView, дисплей устройства может зависать.

Я знаю, что он содержит ListView, но такой же для RecyclerView. Рамка анимации должна фиксировать значение , как только выкладываются представления, а ListView и RecyclerView получают дополнительное время, чтобы получить адаптер, создать дочерние представления, выложить эти дочерние представления на экране, а затем привязать их к данные. Структура перехода не может «видеть» эти взгляды.

Мое лучшее предложение для вас состоит в том, чтобы иметь «поддельный» элемент с вашего адаптера, надутый на фактическую деятельность, выложенную, просто для перехода на выполнение, а затем onStart вы установите этот вид go GONE.

редактировать:

на основе линии, предоставленной OP (Having issues using Android 5.0 Activity transitions onto an activity with a ViewPager) Я закончилось развиваю свой собственный, но очень похожее решение.

В моем собственном проекте у меня есть GridLayoutManager с примерно 7 элементами на экран и анимация LinearLayoutManager, в основном по 1 на просмотр (но иногда вы можете видеть углы одного до или после).

В ответном ответе решение должно использовать Activity.postponeEnterTransition() и Activity.startPostponedEnterTransition() и OnPreDrawListener для правильного доставки всех переходов.

Важным фактом, который следует помнить, является то, что представление должно быть прикреплено к окну для структуры перехода для его захвата. Поэтому я использовал OnAttachStateChangeListener для отправки перехода, а не OnPreDraw. Это должно сделать его до тонкого плавного перехода.

// somewhere on the `onBind` code I put that 
itemView.addOnAttachStateChangeListener(listener); 

// and this is the listener 
private final View.OnAttachStateChangeListener listener = new View.OnAttachStateChangeListener() { 
     @Override public void onViewAttachedToWindow(View v) { 
      activity.startPostponedEnterTransition(); 
      v.removeOnAttachStateChangeListener(this); 
     } 

     @Override public void onViewDetachedFromWindow(View v) { 
      v.removeOnAttachStateChangeListener(this); 
     } 
     }; 

это прекрасно работает для меня.

+0

не знал это. Спасибо за информацию. На самом деле, я буду придерживаться только анимации перехода назад и просто забыть об анимации отображения в этом случае на данный момент ... Я не хочу создавать первые представления на подробном представлении дважды, хотя это не так много работы. В настоящее время это jsut маленькая ошибка красоты, с которой я могу жить, если она не поддерживается – prom85

+0

только одна вещь, это также должно быть актуально для viewpager, не так ли? – prom85

+0

Я никогда не тестировал, но я уверен, что ViewPager будет иметь ту же самую проблему – Budius

0

1 - Убедитесь, что ваш RecyclerView имеет правильный вид (ы) завышены

2 - Добавление SharedElementCallback с помощью setEnterSharedElementCallback и переопределения "onMapSharedElements".

3 - Добавить отсутствующие виды на карту sharedElements (получить их непосредственно из адаптера или RecyclerView).

setEnterSharedElementCallback(new SharedElementCallback() { 
     @Override 
     public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { 
      sharedElements.put("bla", recyclerView.findViewWithTag("bla")); 
      super.onMapSharedElements(names, sharedElements); 
     } 
    }); 
Смежные вопросы