Android Ошибка анимации переходов RecyclerView - PullRequest
0 голосов
/ 18 июня 2020

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

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

Я подготовил проект, демонстрирующий эту проблему.

Вот это выглядит как

Ниже приведен пример кода.

Буду признателен за любую информацию по проблеме.

Спасибо!

Фрагмент и адаптер:

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" />
...