У меня есть макет, который содержит горизонтальный вид ресайклера и слайд-меню, идущее справа. Требование состоит в том, чтобы отрегулировать размер представления ресайклера, когда меню выдвигается - когда меню сдвигается в представлении ресайклера, оно должно сжиматься, а когда оно выдвигается, оно должно расширяться.
Я реализовал слайд-анимацию с помощью переходов. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что всякий раз, когда представление ресайклера сжимается, если последний элемент обрезан, он на секунду выскакивает за пределы своего родительского представления, когда запускается анимация для его удаления, а затем исчезает. Выглядит плохо, и я ищу способ это исправить.
Я подготовил проект, демонстрирующий эту проблему.
Вот это выглядит как
Ниже приведен пример кода.
Буду признателен за любую информацию по проблеме.
Спасибо!
Фрагмент и адаптер:
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" />