Android 中数据库更新时更新 RecyclerView 数据

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

我正在开发一个Android项目,每当数据库更新时我都需要更新RecyclerView数据。

对于在哪里调用数据库操作,我有两个选项:

  • 在主活动中
  • 在 RecyclerView 适配器类本身中

我不确定哪种方法在最佳实践和可维护性方面更好。

方法一:MainActivity中的数据库操作

// MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var recyclerViewAdapter: TaskRecyclerViewAdapter
    private lateinit var db: DatabaseHandler

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        db = DatabaseHandler(this)
        recyclerViewAdapter = TaskRecyclerViewAdapter(db.getAllTasks())

        // Setup RecyclerView
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.adapter = recyclerViewAdapter
        recyclerView.layoutManager = LinearLayoutManager(this)
    }

    private fun addTask(task: TaskModel) {
        db.addTask(task)
        recyclerViewAdapter.setTaskList(db.getAllTasks())
    }

    private fun updateTask(task: TaskModel) {
        db.updateTask(task.id.toLong(), task.taskText)
        recyclerViewAdapter.setTaskList(db.getAllTasks())
    }

    private fun deleteTask(taskId: Int) {
        db.deleteTask(taskId.toLong())
        recyclerViewAdapter.setTaskList(db.getAllTasks())
    }
}

方法2:RecyclerView Adapter 中的数据库操作

// TaskRecyclerViewAdapter.kt
class TaskRecyclerViewAdapter(
    private val context: Context,
    private val db: DatabaseHandler
) : RecyclerView.Adapter<TaskRecyclerViewAdapter.ViewHolder>() {

    private var taskList: MutableList<TaskModel> = db.getAllTasks()

    inner class ViewHolder(private val binding: TasksRecyclerViewRowBinding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(task: TaskModel) {
            binding.apply {
                checkBox.isChecked = task.isDone
                taskTextView.text = task.taskText

                checkBox.setOnClickListener {
                    db.updateStatus(task.id.toLong(), checkBox.isChecked)
                    taskList = db.getAllTasks()
                    notifyDataSetChanged()
                }
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = TasksRecyclerViewRowBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(taskList[position])
    }

    override fun getItemCount(): Int = taskList.size

    fun addTask(task: TaskModel) {
        db.addTask(task)
        taskList = db.getAllTasks()
        notifyDataSetChanged()
    }

    fun updateTask(task: TaskModel) {
        db.updateTask(task.id.toLong(), task.taskText)
        taskList = db.getAllTasks()
        notifyDataSetChanged()
    }

    fun removeTask(taskId: Int) {
        db.deleteTask(taskId.toLong())
        taskList = db.getAllTasks()
        notifyDataSetChanged()
    }
}

当数据库更新时,哪种方式更新RecyclerView数据更好? 在这两种方法之间进行选择时,我应该注意哪些最佳实践或注意事项?

android kotlin sqlite android-recyclerview
1个回答
0
投票

显然是MVC编程设计。方法2更好,虽然并不完美。

我的建议是直接为

MutableList<TaskModel>
的每个查询或修改重用和修改
position
,然后更新你的数据库,最后调用
notifyItemChanged()
而不是
notifyDataSetChanged()
。修改后无需从db获取最新数据(只需在调用
init()
的fun
TaskRecyclerViewAdapter
时查询一次即可)。

© www.soinside.com 2019 - 2024. All rights reserved.