【发布时间】:2020-08-04 12:26:45
【问题描述】:
我有 2 个 RecyclerViews - 概述和详细信息 RV。当用户单击 Overview RV 中的某个项目时,单击的 View 将作为共享元素添加到 Fragment Transaction 中并转换为 Detail RV。
问题:
过渡的运动部分效果很好。但是,转换完成后,共享元素 View 不会从 Detail RV 中删除!当我滚动 Detail RV 时,我可以看到共享元素的 2 个实例!一个与其余内容一起滚动(这是我想要的),另一个则停留在屏幕上的固定位置。只有当我将共享元素向外滚动并返回到 RV 的视口中并强制重新绑定时,不需要的共享元素才会消失。
是什么导致共享元素 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 中准备共享元素转换的方式。被点击的item永远是DetailFragment中的第一个唯一item,所以保证会被绘制出来。
// 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 没有被自动移除呢?
【问题讨论】:
标签: android-recyclerview shared-element-transition