我尝试按照 Traversy Media 教程在 Android 上创建一个简单的 ToDo 应用程序https://youtu.be/BBWyXo-3JGQ。 然而,由于 Android 停止支持综合视图绑定,他们编写应用程序的方式不再有效。
我尝试自己重写绑定,但是应用程序现在仅显示带有“示例”名称的新任务,而不是您为每个任务填写的自定义名称。 显然,问题似乎出在观点上。 这是我的班级文件。
MainActivity.kt
package com.example.todo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.View
import com.example.todo.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var toDoAdapter: ToDoAdapter
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view: View = binding.root
setContentView(view)
toDoAdapter = ToDoAdapter(mutableListOf(), layoutInflater)
binding.RVToDoItems.adapter = toDoAdapter
binding.RVToDoItems.layoutManager = LinearLayoutManager(this)
binding.BTNAddToDo.setOnClickListener {
val toDoTitle = binding.ETToDoTitle.text.toString()
if (toDoTitle.isNotEmpty()) {
val todo = ToDo(toDoTitle)
toDoAdapter.addToDo(todo)
binding.ETToDoTitle.text.clear()
}
}
binding.BTNDeleteDoneToDos.setOnClickListener {
toDoAdapter.deleteDoneToDos()
}
}
}
待办事项.kt
package com.example.todo
data class ToDo(
val title: String,
var isChecked: Boolean = false
)
ToDoAdapter.kt
package com.example.todo
import android.content.ClipData.Item
import android.graphics.Paint.STRIKE_THRU_TEXT_FLAG
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.todo.databinding.ActivityMainBinding
import com.example.todo.databinding.ItemTodoBinding
class ToDoAdapter(
private val todos : MutableList<ToDo>,
private val inflater: LayoutInflater
) : RecyclerView.Adapter<ToDoAdapter.ToDoViewHolder>() {
private val binding : ItemTodoBinding = ItemTodoBinding.inflate(inflater);
class ToDoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ToDoViewHolder {
return ToDoViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_todo,
parent,
false
)
)
}
fun addToDo(todo: ToDo) {
todos.add(todo)
notifyItemInserted(todos.size - 1)
}
fun deleteDoneToDos() {
todos.removeAll { todo ->
todo.isChecked
}
notifyDataSetChanged()
}
private fun toggleStrikeThrough(TVToDoTitle: TextView, isChecked: Boolean) {
if (isChecked) {
TVToDoTitle.paintFlags = TVToDoTitle.paintFlags or STRIKE_THRU_TEXT_FLAG
}
else {
TVToDoTitle.paintFlags = TVToDoTitle.paintFlags and STRIKE_THRU_TEXT_FLAG.inv()
}
}
override fun getItemCount(): Int {
return todos.size
}
override fun onBindViewHolder(holder: ToDoViewHolder, position: Int) {
val currTodo = todos[position]
holder.itemView.apply {
binding.TVToDoTitle.text = currTodo.title
binding.CBDone.isChecked = currTodo.isChecked
toggleStrikeThrough(binding.TVToDoTitle, currTodo.isChecked)
binding.CBDone.setOnCheckedChangeListener{ _, isChecked ->
toggleStrikeThrough(binding.TVToDoTitle, isChecked)
currTodo.isChecked = !currTodo.isChecked
}
}
}
}
任何人都可以帮助我使用最新的视图绑定将应用程序https://github.com/philipplackner/TodoList重写为完全工作的版本吗? 我使用视图绑定的方式似乎有错误。
我尝试像您一样使用 com.example.todo.databinding
import kotlinx.android.synthetic.
然而,我使用数据绑定的方式似乎有问题,新项目没有按预期刷新。我只能创建标题为“示例”的新任务,删除选中的项目也不起作用。