Почему это представление общего элемента не удаляется автоматически после завершения перехода общего элемента? - PullRequest
1 голос
/ 04 августа 2020

У меня есть 2 RecyclerViews - Overview & Detail RV. Когда пользователь щелкает элемент в обзоре RV, выбранный вид добавляется как общий элемент в транзакции фрагмента и переходит в подробный RV.

Проблема:

Движущаяся часть перехода работает очень хорошо. Однако после завершения перехода общий элемент View не удаляется из Detail RV! Когда я прокручиваю деталь RV, я вижу 2 экземпляра общего элемента! Один прокручивает остальной контент (это то, что я хочу), а другой застревает в фиксированной позиции на экране. Только когда я прокручиваю общий элемент назад и обратно в окно просмотра RV, вызывая повторную привязку, нежелательный общий элемент исчезнет.

Что вызывает автоматическое удаление общего элемента View?

Код:

Вот как я добавляю выбранный View в качестве цели для переходов общих элементов.

// OverviewAdapter.kt:

view.setOnClickListener { view ->
    val sharedElements = getAllChildrenWithTransitionNames(view) // returns Map<String,View>

    supportFragmentManager.beginTransaction()
        .replace(R.id.fragmentContainer, DetailFragment())
        .addToBackStack(null)
        .also{ ft ->
            ft.setReorderingAllowed(true)
            sharedElements.forEach { (tn, view) ->
                ft.addSharedElement(view, tn)
            }
        }
        .commit()
}

Вот как я готовлю переход общего элемента в DetailFragment. Выбранный элемент всегда будет первым уникальным элементом в DetailFragment, поэтому он гарантированно будет отрисован.

// DetailFragment.kt
class DetailsTransition : TransitionSet() {
    init {
        addTransition(ChangeBounds())
        addTransition(ChangeTransform())
        addTransition(ChangeImageTransform())
    }
}

val listAnimator = MyRVItemAnimator()

override fun onCreate(saved: Bundle?){
    listAnimator.blockAnimations = true // Detail RV has an item animator. This blocks animations during transitions to prevent flicker
    sharedElementEnterTransition = DetailsTransition().also {
        it.addListener(
          onEnd = {
            listAnimator.blockAnimations = false
          }
        )
}


// DetailAdapter.kt
override fun onBindViewHolder(holder: VH, position: Int) {
    detailFragment.startPostponedEnterTransition()
}

Я также убедился, что все transitionNames уникальны и совпадают. Так почему же общий элемент View не удаляется автоматически после завершения перехода?

1 Ответ

1 голос
/ 04 августа 2020

Оказывается, в моем RV ItemAnimator была ошибка. Когда я блокировал анимацию, я не звонил dispatchAdd/RemoveFinished(holder). Это привело к тому, что общий элемент View остался позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...