带有 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”运算符确保删除线被反转。
我有一个待办事项应用程序,我正在从我的 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”运算符确保删除线被反转。