1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.RecyclerView
class DateItemAnimator : DefaultItemAnimator() {
override fun animateChange(
oldHolder: RecyclerView.ViewHolder,
newHolder: RecyclerView.ViewHolder,
fromX: Int,
fromY: Int,
toX: Int,
toY: Int
): Boolean {
if (oldHolder.itemViewType == newHolder.itemViewType) {
val anim = ObjectAnimator.ofFloat(newHolder.itemView, "alpha", 0f, 1f)
anim.duration = 250
anim.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
dispatchAnimationFinished(newHolder)
}
})
anim.start()
return true
}
return super.animateChange(oldHolder, newHolder, fromX, fromY, toX, toY)
}
override fun canReuseUpdatedViewHolder(viewHolder: RecyclerView.ViewHolder, payloads: MutableList<Any>): Boolean {
return true
}
override fun getChangePayload(oldHolder: RecyclerView.ViewHolder, newHolder: RecyclerView.ViewHolder): Any? {
return newHolder.itemView.context.getString(R.string.date_changed)
}
override fun animateChange(
oldHolder: RecyclerView.ViewHolder,
newHolder: RecyclerView.ViewHolder,
preInfo: ItemHolderInfo,
postInfo: ItemHolderInfo
): Boolean {
val animators = ArrayList<Animator>()
if (preInfo.left != postInfo.left || preInfo.top != postInfo.top) {
val xAnimator = ObjectAnimator.ofFloat(newHolder.itemView, "translationX", preInfo.left.toFloat(),
|