带有 PaintsFlag STRIKE_THRU_TEXT_FLAG 的 ViewBinding 无法正常工作

ViewBinding with PaintsFlag STRIKE_THRU_TEXT_FLAG not working properly

我有一个待办事项应用程序,我正在从我的 onBindViewHolder class 使用 ViewBinding 访问我的视图。我放置了一个函数来检查布尔值(在这个意义上是一个复选框)的状态,并根据该布尔值的状态在 TextView(Todo) 上切换删除线。我还放置了一个 setOnCheckedChangeListener 来了解复选框的状态何时更改,并将该新状态分配给我为复选框存储的布尔变量。然而,尽管多次更改实施,但它仍无法正常工作。这是我的代码。

但首先这是我的 class

@Entity(tableName = "todo_table")
data class Todo(
    @PrimaryKey (autoGenerate = true) // here "Room" will autoGenerate the id for us 
    // instead 
    // of assigning a randomUUID value
    val id : Int = 0,
    var title : String = "",
    var date : Date = Date(),
    var time : Date = Date(),
    var todoCheckBox : Boolean = false
)

还有我的适配器

import android.annotation.SuppressLint
import android.graphics.Paint.STRIKE_THRU_TEXT_FLAG
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.Adapter
import com.bignerdranch.android.to_dolist.databinding.CustomRowBinding
import com.bignerdranch.android.to_dolist.fragments.add.SIMPLE_DATE_FORMAT
import com.bignerdranch.android.to_dolist.fragments.add.SIMPLE_TIME_FORMAT
import com.bignerdranch.android.to_dolist.model.Todo
import java.text.SimpleDateFormat
import java.util.Locale


class ListAdapter: Adapter<ListAdapter.TodoViewHolder>() {
    private var todoList = emptyList<Todo>()


    // will toggle strikeThrough on the Task title
    private fun toggleStrikeThrough(tvTaskTitle : TextView, cbTask : Boolean) {
        if (cbTask) {
            tvTaskTitle.paintFlags = tvTaskTitle.paintFlags  or STRIKE_THRU_TEXT_FLAG
    } else {
        tvTaskTitle.paintFlags = tvTaskTitle.paintFlags or STRIKE_THRU_TEXT_FLAG.inv()
    }
}

inner class TodoViewHolder(val binding : CustomRowBinding) : RecyclerView.ViewHolder(binding.root)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder {
    // this can be done in an inline variable and I may experiment on it later.
    val binding = CustomRowBinding.inflate(LayoutInflater.from(parent.context),
        parent,
        false
    )
    return TodoViewHolder(binding)

}

override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
    val todo = todoList[position]
    val dateLocales = SimpleDateFormat(SIMPLE_DATE_FORMAT, Locale.getDefault())
    val timeLocales = SimpleDateFormat(SIMPLE_TIME_FORMAT, Locale.getDefault())
    holder.apply {
        binding.tvTaskTitle.text = todo.title
        binding.tvTaskDate.text = dateLocales.format(todo.date)
        binding.tvTaskTime.text = timeLocales.format(todo.time)
        binding.cbTask.isChecked = todo.todoCheckBox

        binding.cbTask.setOnCheckedChangeListener { _, isChecked ->
            toggleStrikeThrough(binding.tvTaskTitle, isChecked)
            todo.todoCheckBox = !todo.todoCheckBox
        }

    }
}

// as usual will return the size of the List
override fun getItemCount() = todoList.size

@SuppressLint("NotifyDataSetChanged")
fun setData(todo : List<Todo>) {
    this.todoList = todo
    // todo - This is a suppressed lint warning. Later check it online and see if there is a way to improve it.
    notifyDataSetChanged()
}

}

这是我在物理设备或模拟器上 运行 应用程序时的异常行为。当我点击 CheckBox 时,删除线出现,但当我再次点击它时,textView 本身消失了,删除线仍然存在,当我再次点击它时,另一个删除线出现,使它成为两个,但 textView 仍然丢失。

就是这个

我已经使用了 paintsFlag 的不同实现,但它仍然无法正常工作。我也遵循了我使用的完全相同的教程,但仍然无法正确使用 ViewBinding。

我刚刚发现我在 paintsFlag 的 else 条件中使用了“或”按位运算符而不是“和”,这就是导致错误的原因,所以我将其更改为“和”及其现在工作。 “and”运算符确保删除线被反转。