我的布局包含一个水平的回收站视图和一个来自右侧的幻灯片菜单。 要求是在菜单滑入时调整回收器视图的大小-当菜单在回收器视图中滑动时应缩小,而在滑出视图时则应扩大。
我使用过渡效果实现了幻灯片动画。 我现在面临的问题是,每当回收者视图缩小时,如果最后一个项目被切掉,则当要删除的动画开始播放时,它会从其父视图的边界弹出一秒钟,然后淡出。这看起来很糟糕,我正在寻找一种解决方法。
我准备了一个演示此问题的项目。
下面是示例代码。
希望对这个问题有任何见解。
谢谢!
片段和适配器:
class FirstFragment : Fragment() {
private var startSet = ConstraintSet()
private var endSet = ConstraintSet()
private var isOnEndSet = false
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val a = Adapter()
recycler.apply {
layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
(itemAnimator as? SimpleItemAnimator)?.supportsChangeAnimations = false
adapter = a
}
a.submitList(listOf("aaaaaa", "bbbbbbbbbbbbbbbbbb", "ccccccccccccccc", "dddddddddddd", "eeeeeeeeeeeeeee"))
startSet.clone(root.context, R.layout.fragment_first)
endSet.clone(root.context, R.layout.fragment_first_anim)
animator.setOnClickListener {
val transition: Transition = AutoTransition()
transition.duration = 300
transition.interpolator = DecelerateInterpolator()
TransitionManager.beginDelayedTransition(root, transition)
if (isOnEndSet) {
startSet.applyTo(root)
} else {
endSet.applyTo(root)
}
isOnEndSet = !isOnEndSet
}
}
}
class Adapter: ListAdapter<String, ViewHolder>(DiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val tool = getItem(position)
holder.bind(tool)
}
}
class ViewHolder(viewItem: View): RecyclerView.ViewHolder(viewItem) {
private val listItem = itemView.listItem
companion object {
fun from(parent: ViewGroup): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.list_item, parent, false)
return ViewHolder(view)
}
}
fun bind(item: String) {
listItem.text = item
val color = (Math.random() * 16777215).toInt() or (0xFF shl 24)
listItem.setBackgroundColor(color)
}
}
class DiffCallback: DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
return oldItem == newItem
}
}
布局-fragment_first.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FirstFragment">
<Button
android:layout_width="100dp"
android:layout_height="100dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="ANIMATE"
android:id="@+id/animator" />
<TextView
android:id="@+id/textview_first"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="I'M A MENU"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_margin="10dp"
android:background="@drawable/recycler_border"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textview_first"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal"
tools:listitem="@layout/list_item"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
布局-fragment_first_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FirstFragment">
<TextView
android:id="@+id/textview_first"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="I'M A MENU"
android:background="@color/colorPrimaryDark"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_margin="10dp"
android:background="@drawable/recycler_border"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/textview_first"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal"
tools:listitem="@layout/list_item"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/listItem"
android:layout_height="100dp"
android:layout_width="wrap_content"
android:text="ITEM"
android:background="@color/design_default_color_error"
android:gravity="center"
android:padding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" />