Recyclerview:更新屏幕外的视图元素

Recyclerview: update view elements outside the screen

我有一个回收站视图,如下所示:

开始时,这些圆圈图标是空的。我需要在 5 秒的间隔内将回收站的每个图标从空变为满(见上图)。

我其实可以更新这些图标,但我的问题是: 如果我有 20 件物品,我需要滚动回收器才能看到每件物品。每当我滚动回收器时,最后 4-5 个项目不会从空更新为满。

我只需要更新 UI,我不需要删除或添加任何东西到 recyclerview。我已经尝试使用 notifyDataSetChanged()、notifyItemChanged(),但到目前为止没有任何效果。 你有什么建议?提前谢谢你

这是一种策略。在你的适配器中有一个函数来 start/reset 动画。您可以在设置数据列表时调用它。在 onBindViewHolder 中,您计算​​相对于现在的图标应该何时变为已填充(可能是过去)。如果时间为负,ViewHolder class 要么立即显示填充图标,要么发布一个延迟的可运行对象以在将来更改它。您需要取消任何之前延迟的可运行对象,以便在回收视图时,它们始终会更新到正确的状态。

//Inside your ViewHolder class:
private val setIconRunnable = Runnable { setFilledIcon() }

fun fillIconAt(timeFromNowMillis: Long) {
    itemView.removeCallbacks(setIconRunnable)
    if (timeFromNowMillis <= 0L) {
        setFilledIcon()
    } else {
        setEmptyIcon()
        itemView.postDelayed(setIconRunnable, timeFromNowMillis)
    }
}
// In your adapter class:
companion object {
    private const val ANIMATION_DURATION = 5000L
}

private var animationStartTime = 0L

fun initiateIconAnimation() {
    animationStartTime = System.currentTimeMillis()
    notifyDataSetChanged()
}

override fun onBindViewHolder(holder: YourViewHolderType, position: Int) {
    //...

    val iconChangeTime = (
            ANIMATION_DURATION * (position + 1).toFloat() / yourDataList.size
        ).roundToLong() + animationStartTime
    holder.fillIconAt(iconChangeTime - System.currentTimeMillis())
}