Android 如果动画';s被卷走(注意它不是循环使用的)
我正在实现一个recyclerview和一个适配器(显然)。在ViewHolders中,我有一个可单击的ImageView。此imageView使用XML格式的动画,可以是“填充的心脏”和“未填充的心脏”。启用时,它会自下而上充满心脏。当禁用时,它会使心脏破裂,心脏恢复为“未填充的心脏” 我如何创建我的“bug”:Android 如果动画';s被卷走(注意它不是循环使用的),android,android-recyclerview,kotlin,Android,Android Recyclerview,Kotlin,我正在实现一个recyclerview和一个适配器(显然)。在ViewHolders中,我有一个可单击的ImageView。此imageView使用XML格式的动画,可以是“填充的心脏”和“未填充的心脏”。启用时,它会自下而上充满心脏。当禁用时,它会使心脏破裂,心脏恢复为“未填充的心脏” 我如何创建我的“bug”: 开放应用程序 “心脏”我的项目(保存在DB中,并在以后每次打开应用程序时加载)。这将激活动画以填充心脏,心脏将保持填充状态 如果我只是为了看不到我的项目而滚动,然后备份,则心脏“未填
fun onTrackClick(tracking : Boolean){
Log.d(TAG, "Clling onTrack!")
val stateSet = intArrayOf(android.R.attr.state_checked * if (tracking) 1 else -1)
btn.setImageState(stateSet, true);
}
fun bind(item: Media, viewActions: onViewSelectedListener){
if(item.imgpath.isNotEmpty()){
image.loadImg("https://image.tmdb.org/t/p/w342/${item.imgpath}") // 342 vs 500
}
id = item.tmdbid
viewActions.getSingleMedia(item.tmdbid)
?.observeOn(AndroidSchedulers.mainThread())
?.subscribeOn(Schedulers.io())
?.subscribe({ singleMedia ->
onTrackClick(true)
tracking = true}, {throwable -> onTrackClick(false)})
Log.d(TAG, "In here for ${item.tmdbid}")
title.text = item.name
rating.text = "${item.rating}"
btn.setOnClickListener {
viewActions.onTracking(item)
tracking = !tracking
onTrackClick(tracking)
}
super.itemView.setOnClickListener { viewActions.onItemSelected(item)} // Only need ID.
}
然后我的ImageView将被设置为动画:
<ImageView
android:id="@+id/img_button_tracker_media_item"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:scaleType="center"
android:transitionName="HEART"
android:src="@drawable/asl_trimclip_heart"
app:layout_constraintBottom_toBottomOf="@+id/rating"
app:layout_constraintEnd_toEndOf="@+id/imageView"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/rating"
app:layout_constraintVertical_bias="0.52" />
以及动画:
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/liked"
android:drawable="@drawable/vd_trimclip_heart_full"
android:state_checked="true"/>
<item
android:id="@+id/not_liked"
android:drawable="@drawable/vd_trimclip_heart_empty"/>
<transition
android:drawable="@drawable/avd_trimclip_heart_fill"
android:fromId="@id/not_liked"
android:toId="@id/liked"/>
<transition
android:drawable="@drawable/avd_trimclip_heart_break"
android:fromId="@id/liked"
android:toId="@id/not_liked"/>
</animated-selector>
提前谢谢 我猜你更喜欢50%的答案,而不是完全没有答案,所以这是我的2美分: 您的数据有两种状态:心脏已填充和心脏未填充。这两种状态应通过显示不同的可提取资源反映在
视图中
因此,基本上您必须在RecyclerView.Adapter
实现中使用两种View
类型。为此,需要覆盖getItemViewType()
并返回当前状态的正确视图类型,在onCreateViewHolder()
中,需要根据视图类型设置可绘制资源
如果您对RecyclerView
项“心”或“听不见”,则其状态必须更改。您已经在更新基础数据(否则,视图
回收后,状态将无法正确显示)。所以剩下要做的就是调用RecyclerView.Adapter
上的notifyItemChanged()
。您可以将此延迟到动画完成后(例如,在android.os.Handler实例上使用postDelayed()方法),或者尝试实现自己的RecyclerView.ItemAnimator
(但只有在另一种方法由于可绘制对象闪烁而看起来不好时)我想说的是,您的问题实际上并不是设置填充硬的最终状态,每当您在RecyclerView
中有两个状态时,您一定不要忘记设置“特殊”情况(在这种情况下,填充的心脏)
也就是说,如果检查模型的值,则必须始终设置当前状态,一个简单的示例是:
onBindViewHolder(..) {
// The View.GONE is the easly forgot state
imageView.visibility = if(someModel.isShowImageView()) View.VISIBLE else View.GONE)
}
简单地说,完成动画后,您应该将imageView设置为其最终状态(已填充的心脏),否则当动画重置(视图外)时,您将显示初始状态。自我提示:更新Android Studio并真正开始学习Kotlin!如上所述,我自己也在考虑这种解决方案,但希望能有一个更干净的解决方案。我不喜欢这种方法,但它是有效的,所以必须这样做。谢谢!:)编辑:是的,你应该这么做,Kotlin是如此有趣的程序!谢谢我自己也在考虑这个解决方案,但我希望能有一个更干净的解决方案。不过还是成功了,谢谢你!