October 22, 2024
Chicago 12, Melborne City, USA
Android

Updating RecyclerView Data When Database is Updated in Android


I’m working on an Android project where I need to update the RecyclerView data whenever the database is updated.

I have two options for where to call the database operations:

  • In the MainActivity
  • In the RecyclerView adapter class itself

I’m not sure which approach is better in terms of best practices and maintainability.

Approach 1: Database Operations in 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())
    }
}

Approach 2: Database Operations in 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()
    }
}

Which approach is better for updating the RecyclerView data when the database is updated?
Are there any best practices or considerations I should be aware of when choosing between these two methods?



You need to sign in to view this answers

Leave feedback about this

  • Quality
  • Price
  • Service

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video