Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果动画';s被卷走(注意它不是循环使用的)_Android_Android Recyclerview_Kotlin - Fatal编程技术网

Android 如果动画';s被卷走(注意它不是循环使用的)

Android 如果动画';s被卷走(注意它不是循环使用的),android,android-recyclerview,kotlin,Android,Android Recyclerview,Kotlin,我正在实现一个recyclerview和一个适配器(显然)。在ViewHolders中,我有一个可单击的ImageView。此imageView使用XML格式的动画,可以是“填充的心脏”和“未填充的心脏”。启用时,它会自下而上充满心脏。当禁用时,它会使心脏破裂,心脏恢复为“未填充的心脏” 我如何创建我的“bug”: 开放应用程序 “心脏”我的项目(保存在DB中,并在以后每次打开应用程序时加载)。这将激活动画以填充心脏,心脏将保持填充状态 如果我只是为了看不到我的项目而滚动,然后备份,则心脏“未填

我正在实现一个recyclerview和一个适配器(显然)。在ViewHolders中,我有一个可单击的ImageView。此imageView使用XML格式的动画,可以是“填充的心脏”和“未填充的心脏”。启用时,它会自下而上充满心脏。当禁用时,它会使心脏破裂,心脏恢复为“未填充的心脏”

我如何创建我的“bug”:

  • 开放应用程序
  • “心脏”我的项目(保存在DB中,并在以后每次打开应用程序时加载)。这将激活动画以填充心脏,心脏将保持填充状态
  • 如果我只是为了看不到我的项目而滚动,然后备份,则心脏“未填充”。该项目从来没有得到回收的一部分,它只是失去了视觉。可以说,“未填满的心”是动画的基本状态
  • 如果我现在单击心脏,则“中断”-动画(即,前所未闻)将按应有的方式激活。但它来自《未填满的心》->《破碎动画》->《未填满的心》
  • 注意:

  • 我不希望我的“心满意足”状态仅仅因为视图不可见而倒退
  • 如果我的视图被循环使用,然后通过绑定返回,那么填充的心的状态就存在了
  • 我的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>
    
    
    

    提前谢谢

    我猜你更喜欢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是如此有趣的程序!谢谢我自己也在考虑这个解决方案,但我希望能有一个更干净的解决方案。不过还是成功了,谢谢你!