【发布时间】:2020-04-29 17:45:26
【问题描述】:
我有一个Recyclerview,并且我希望在任何行的TextView 文本值发生变化时有闪烁动画和颜色变化,并且在动画结束时,我希望TextView 恢复其初始颜色.
class EventsAdapter : RecyclerView.Adapter<EventsAdapter.ViewHolder>() {
var events: List<Event> = emptyList()
set(value) {
DiffUtil.calculateDiff(EventsDiffUtil(events, value))
.dispatchUpdatesTo(this)
field = value
}
private lateinit var animation: Animation
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = EventItemBinding.inflate(layoutInflater, parent, false)
animation = AnimationUtils.loadAnimation(parent.context, R.anim.blink)
return ViewHolder(binding)
}
override fun getItemCount(): Int = events.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(events[position])
}
inner class ViewHolder(
val binding: EventItemBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(event: Event) {
with(binding) {
nameTv.text = event.name
if (!countTv.text.isNullOrBlank())
countTv.startAnimation(animation)
countTv.text = event.count.toString()
}
}
}
}
class EventsDiffUtil(
private val oldList: List<Event>,
private val newList: List<Event>
) : DiffUtil.Callback() {
override fun getOldListSize(): Int = oldList.size
override fun getNewListSize(): Int = newList.size
override fun areItemsTheSame(oldPosition: Int, newPosition: Int): Boolean {
return oldList[oldPosition].id == newList[newPosition].id
}
override fun areContentsTheSame(oldPosition: Int, newPosition: Int): Boolean {
return oldList[oldPosition] == newList[newPosition]
}
}
我能够让闪烁动画工作,但我不确定这是否是正确的做法,我不知道如何改变颜色。我知道我可以使用AnimationListener 接口,但不确定如何以及在哪里设置它。
任何帮助将不胜感激。
【问题讨论】:
标签: android kotlin android-recyclerview android-animation android-adapter