【问题标题】:How to use AnimatedStateListDrawable inside a RecyclerView如何在 RecyclerView 中使用 AnimatedStateListDrawable
【发布时间】:2021-04-12 03:53:30
【问题描述】:

我正在尝试创建具有 doneundone 状态的任务列表的RecyclerView,我想在这些状态之间创建一个漂亮的过渡。

所以我创建了一个animated-selector 来进行状态之间的转换,但是当我在RecyclerView 内使用它时,转换不起作用,当我在RecyclerView 之外的按钮/ImageView 上测试它时它可以工作应该的。

Screen with the RecyclerView

aslv_status.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/done"
        android:drawable="@drawable/ic_done"
        android:state_selected="true" />
    <item
        android:id="@+id/undone"
        android:drawable="@drawable/ic_undone" />
    <transition
        android:drawable="@drawable/avd_done_to_undone"
        android:fromId="@id/done"
        android:toId="@id/undone" />
    <transition
        android:drawable="@drawable/avd_undone_to_undone"
        android:fromId="@id/undone"
        android:toId="@id/done" />
</animated-selector>

我在适配器项onClickListener 中切换Task 的属性isDone 并将animated-selector 设置为我的recyclerView 适配器项的AppCompatImageViewandroid:src

item_task.xml

<com.google.android.material.card.MaterialCardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{() -> viewModel.toggleTaskState(task)}" >
    ...
    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/imageview_status_image"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:src="@drawable/aslv_status"
        .../>
    ...

TaskViewModel.kt

fun toggleTaskState(task: Task) = viewModelScope.launch {
    task.isDone = !task.isDone
    taskRepository.updateTask(task)
}

TaskAdapterinit 我调用notifyDataSetChanged() 当liveData allTask​​s 发生变化时,在TaskViewHolder 绑定上我更新了AppCompatImageView 选定状态。

TaskAdapter.kt

private var allTasks = viewModel.allTasks

init {
    viewModel.allTasks.observe(lifecycle, {
        notifyDataSetChanged()
    })
}
...
class TaskViewHolder(private var binding: ItemTaskBinding, private val viewModel: TaskViewModel)
    : RecyclerView.ViewHolder(binding.root) {
    fun bind(task: Task) {
        binding.task = task
        binding.viewModel = viewModel
        binding.imageviewStatusImage.isSelected = task.isDone
        binding.executePendingBindings()
    }
}

我认为问题是当我更改 Task 对象的状态时调用的notifyDataSetChanged(),因为我想RecyclerView 会突然更新布局并且不显示过渡状态动画,但如果我不调用notifyDataSetChanged() RecyclerView 不会改变列表项状态。

【问题讨论】:

    标签: android android-recyclerview android-animation android-selector


    【解决方案1】:

    如果有人遇到与我相同的情况,请做出回应。

    notifyDataSetChanged() 方法文档中:

    RecyclerView 会尝试合成可见的结构变化 报告他们有 {@link #hasStableIds() 的适配器的事件 使用此方法时的稳定 IDs}。这可以帮助达到目的 动画和视觉对象的持久性,但单独的项目视图 仍然需要反弹和重新出局。

    所以我将hasStableIds() 设置为我的Adapter,它成功了!

    val taskAdapter = TaskAdapter(this, taskViewModel)
    taskAdapter.setHasStableIds(true)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 2018-01-04
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      相关资源
      最近更新 更多