【问题标题】:Blinking animaton with color change when the value of Recyclerview item's TextView change当 Recyclerview 项目 TextView 的值发生变化时闪烁动画与颜色变化
【发布时间】: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


    【解决方案1】:

    您可以使用通过有效负载 notifyItemChanged(int position, Object payload) 更改的通知项。之后,实现该方法 onBindViewHolder(VH holder, int position, List payloads)。如果想在 item 上播放动画时 item 可见,可以在我上面添加的 onBind 中处理动画。作为有效负载,您应该使用动画颜色,然后在 onBind 中播放动画。

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多