Мигание анимации с изменением цвета при изменении значения TextView элемента Recyclerview - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть 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, но не знаю, как и где его установить.

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

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете использовать элемент уведомления, измененный с полезной нагрузкой notifyItemChanged (int position, Object payload). После этого реализуйте этот метод onBindViewHolder (держатель VH, позиция int, список полезных нагрузок). Если элемент виден, когда вы хотите воспроизвести анимацию на элементе, вы можете обрабатывать анимацию в onBind, который я добавил выше. В качестве полезной нагрузки вы должны использовать цвет анимации, а затем воспроизводить анимацию в onBind.

...