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())
}
我有一个回收站视图,如下所示:
开始时,这些圆圈图标是空的。我需要在 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())
}