Android - элемент перехода элемента разделяемого элемента Recyclerview

Надеюсь, вы могли бы помочь мне в этом вопросе. У меня есть два фрагмента, первый из них - это recyclerview с несколькими изображениями, второй фрагмент - это подробный вид этих изображений. Если пользователь нажимает на изображение, приложение выполняет транзакцию фрагмента и детали отображаются.

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

Ну, тогда проблема, начальная позиция изображения не ожидаема, она начинает перемещать несколько пикселей из своего исходного положения, когда я нажимаю изображение, немного перескакивает вправо и в конец.

Почему это происходит? его раздражает!

Переход xml:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeTransform />
    <changeBounds />
</transitionSet>

Если я делаю то же самое для кнопки вне recyclerview, она отлично работает. Это какая-то ошибка в recyclerview?

Ответ 1

Элементам RecyclerView необходимо установить уникальное имя перехода на их общем представлении. Если вы представляете рендеринговую иерархию своего RecyclerView, в ней будет много элементов (представлений), имеющих одно и то же имя перехода. Таким образом, неясно для перехода, которым является фактический общий элемент. Например, вы можете добавить позицию к имени перехода вида, например. transition1, transition2 и т.д. Теперь, когда вы начинаете свой фрагмент детали, вам нужно передать ему имя перехода и установить это имя для общего представления в фрагменте детали, например. в onViewCreated().

Ответ 2

Если ваши общие элементы ImageView s, вам также необходимо использовать переход ChangeImageTransform. Попробуйте добавить <changeImageTransform /> к вашему набору переходов.

Ответ 3

Это может произойти, если правильный вид не будет получен из вашего вида ресайклера. Убедитесь, что вы используете точный вид (в зависимости от позиции) вместо корневого представления. Напр. в приведенном ниже фрагменте следует использовать View v (который вы получаете в onClick()):

mAdapter.setOnItemClickListener(

                new MyAdapter.OnItemClickListener() {

                    @Override
                    public void onClick(View v, int position) {

                        ImageView heroView;
                        heroView = (ImageView) v.findViewById(R.id.category_icon);
                        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                                getActivity(), heroView, heroView.getTransitionName());
                        ActivityCompat.startActivity(getActivity(), intent, options.toBundle());

Ответ 4

Я решил эту проблему, следуя этой статье Переходы с общим элементом - часть 4: RecyclerView, которая показывает коды и дать подробное объяснение.

убедитесь, что android:transitionName между разделяемыми элементами должен быть тем же, а также должен быть уникальным в иерархии представлений.

Что касается RecyclerView - Fragment, если мы установим transitionName в XML, тогда все ImageView в галерее будет иметь одно и то же, что означает, что когда мы вернемся в галерею, структура не будет представлять, где для перемещения изображения.

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