在 Android Kotlin 应用程序中使用新的视图绑定

问题描述 投票:0回答:0

我尝试按照 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.

然而,我使用数据绑定的方式似乎有问题,新项目没有按预期刷新。我只能创建标题为“示例”的新任务,删除选中的项目也不起作用。

android kotlin view binding
© www.soinside.com 2019 - 2024. All rights reserved.