gpt4 book ai didi

android - RecyclerView.Holder 会在滚动时丢失有关动画的信息(注意它不会被回收)

转载 作者:搜寻专家 更新时间:2023-11-01 09:29:08 26 4
gpt4 key购买 nike

我在其上实现了一个 recyclerview 和一个适配器(很明显)。在 ViewHolders 中,我有一个可点击的 ImageView。此 imageView 使用以 XML 完成的动画,可以是“填充的心”和“未填充的心”。启用时,它会自下而上充满心脏。当禁用它时,它会打破心脏,心脏会恢复到“未填充的心脏”。

我如何创建“错误”:

  1. 打开应用
  2. “收藏”我的项目(这保存在数据库中并在您以后每次打开应用程序时加载)。这将激活填充心脏的动画,心脏将保持填充状态。
  3. 如果我滚动只是为了看不到我的元素,然后再往回滚动,心脏就会“空虚”。该元素从未到达回收部分,它只是从视线中消失了。 “空虚的心”可以说是动画的基本状态。
  4. 如果我现在单击心脏,“break”动画(即 unheart)将按预期激活。但它来自未填满的心 -> splinter 动画 -> 未填满的心。

注意:

  1. 我不希望我的“满心”状态仅仅因为视野超出了“可见度”而回头。
  2. 如果我的 View 被回收,然后通过绑定(bind)返回,就会有满心的状态。

我的 RecyclerView.Holder 函数。

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>

提前致谢!

最佳答案

我会说你的问题实际上不是设置 filled hard 的最终状态,每当你在 RecyclerView 中有两个状态时,你一定不要忘记设置“特殊”情况(在这种情况下,充满的心)。

意思是,如果您检查模型的值,则必须始终设置当前状态,一个简单的示例是:

onBindViewHolder(..) {
// The View.GONE is the easly forgot state
imageView.visibility = if(someModel.isShowImageView()) View.VISIBLE else View.GONE)
}

简单地说,在完成动画后,您应该将 imageView 设置为其最终状态(填充的心),否则当动画重置(不在 View 中)时,您将显示初始状态。

关于android - RecyclerView.Holder 会在滚动时丢失有关动画的信息(注意它不会被回收),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com