3

У меня есть RecyclerView с изображениями, и когда я нажимаю изображение, приложение открывает другое действие, содержащее ViewPager с теми же изображениями, но в том положении, которое я выбрал.Изменение анимации повторного использования на другой элемент списка

Я сделал переход в Lollipop, чтобы разделить это изображение между действиями, используя supportPostponeEnterTransition и supportStartPostponedEnterTransition в вызываемой активности, чтобы ждать, пока viewPager будет загружен изображениями, чтобы начать переход.

Когда я вхожу в вызываемую деятельность, и когда я нажимаю назад, переходы в порядке.

Проблема, с которой я столкнулся, - это если я перехожу к другому изображению в ViewPager вызываемой активности, когда я нажимаю ее, она оживляет изображение, которое было выбрано в начале, а не в данный момент.

Я был в состоянии изменить анимированное изображение к одной, выбранной в вызываемой деятельности с этим:

@Override 
public void onBackPressed() { 
    View view = ((ImageDetailFragment) adapter.getFragment(viewPager, 
     viewPager.getCurrentItem())).getTransitionView(); 

    ViewCompat.setTransitionName(view, Constants.TRANSITION_IMAGE); 
    super.onBackPressed(); 
} 

Но она возвращается в то же положение исходного изображения в списке вызывающего Мероприятия.

Как я могу сделать это, чтобы вернуть изображение в его позицию в списке вызывающей активности?

ответ

6

Первое, что нужно сделать, это убедиться, что представления работают правильно без какого-либо перехода активности. То есть, когда вы возвращаетесь из Activity с ViewPager, Activity RecyclerView Activity должен показывать представление, которое показывало ViewPage. Когда вы вызываете активность ViewPager, используйте startActivityForResult и используйте результат для прокрутки RecyclerView до правильной позиции.

После того, как это работает, переход активности может быть выполнен для работы. Я знаю, что вы дали каждому виду в своем RecyclerView другое имя перехода, не так ли? Когда вы привязываете View, вызываете setTransitionName и присваиваете ему повторяемое имя. Обычно это URL-адрес изображения или идентификатор строки курсора, или, в худшем случае, некоторый индекс munged, такой как индекс «image_» +.

Следующее, что вам нужно сделать, это установить SharedElementCallback как для вызывающего Activity (exit), так и для вызова activity (enter). В каждом случае вам необходимо переопределить обратный вызов onMapSharedElements для переназначения общего элемента.

@Override 
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { 
    // assuming just one shared element, excuse the ugly code 
    sharedElements.put(names.get(0), mSharedElement);   
} 

Здесь mSharedElement был установлен в onActivityReenter в вызывающем (RecyclerView) деятельности и в OnCreate и до finishAfterTransition (onBackPressed?) В вызываемом (ViewPager) деятельности.

OnActivityReenter предоставляет новые функции специально для этого случая. Вы можете посмотреть результаты там до того, как вызванная активность завершится.

+0

Это очень хорошо объяснено, и он отлично работает, когда пользователь переместился на другое изображение, чем оригинальное, которое в настоящее время отображается в RecyclerView. Теперь проблема заключается в том, когда пользователь перемещается к изображению в ViewPager, чем не отображается в RecyclerView. Я сделал первый шаг прокрутки к новой позиции в onActivityResult. Но этот метод вызывается после onActivityReenter, поэтому, когда я пытаюсь получить представление sharedElement с чем-то вроде «rvImages.findViewHolderForPosition (position) .itemView.findViewById (R.id.iv_photo);» Я всегда получаю нуль. – jekopena

+0

И так бывает, если я попытаюсь прокрутить один и тот же метод onActivityReenter, прежде чем получить представление sharedElement. Поскольку представление еще не завышено, я не могу его получить. Любое решение? – jekopena

+0

Вы можете вызвать postponeEnterTransition() в onActivityReenter, чтобы убедиться, что представление готово до начала перехода. Когда он будет готов, вызовите startPostponedEnterTransition() –