【发布时间】:2021-04-12 03:53:30
【问题描述】:
我正在尝试创建具有 done 和 undone 状态的任务列表的RecyclerView,我想在这些状态之间创建一个漂亮的过渡。
所以我创建了一个animated-selector 来进行状态之间的转换,但是当我在RecyclerView 内使用它时,转换不起作用,当我在RecyclerView 之外的按钮/ImageView 上测试它时它可以工作应该的。
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 适配器项的AppCompatImageView 的android: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)
}
在TaskAdapter 上init 我调用notifyDataSetChanged() 当liveData allTasks 发生变化时,在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