If you’re working with Kotlin and Firebase Realtime Database, you may encounter an issue where your UI doesn’t update after changes in the database. This problem typically occurs due to improper usage of ValueEventListener
, lifecycle handling, or incorrect data paths. In this article, you’ll learn how to troubleshoot and fix the problem step-by-step with working code examples.

Common Causes:
- Missing or misplaced
addValueEventListener
- Data structure mismatch
- Not calling
notifyDataSetChanged()
after updating RecyclerView - Wrong database reference path
Let’s go through a working Kotlin example and see how to update data in real-time properly.
Step-by-Step Implementation
1. Model Class (User.kt)
data class User( var id: String? = "", var name: String? = "", var email: String? = "" )
2. Adapter Class (UserAdapter.kt)
class UserAdapter(private val userList: List<User>) : RecyclerView.Adapter<UserAdapter.UserViewHolder>() { inner class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val txtName: TextView = itemView.findViewById(R.id.txtName) val txtEmail: TextView = itemView.findViewById(R.id.txtEmail) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.user_item, parent, false) return UserViewHolder(view) } override fun onBindViewHolder(holder: UserViewHolder, position: Int) { val user = userList[position] holder.txtName.text = user.name holder.txtEmail.text = user.email } override fun getItemCount(): Int = userList.size }
3. MainActivity.kt (Realtime Update Listener)
class MainActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private lateinit var userList: ArrayList<User> private lateinit var userAdapter: UserAdapter private lateinit var databaseRef: DatabaseReference override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView = findViewById(R.id.recyclerView) recyclerView.layoutManager = LinearLayoutManager(this) userList = arrayListOf() userAdapter = UserAdapter(userList) recyclerView.adapter = userAdapter databaseRef = FirebaseDatabase.getInstance().getReference("users") fetchUserData() } private fun fetchUserData() { databaseRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { userList.clear() for (userSnap in snapshot.children) { val user = userSnap.getValue(User::class.java) user?.let { userList.add(it) } } userAdapter.notifyDataSetChanged() } override fun onCancelled(error: DatabaseError) { Toast.makeText(this@MainActivity, "Failed to fetch data", Toast.LENGTH_SHORT).show() } }) } } class MainActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private lateinit var userList: ArrayList<User> private lateinit var userAdapter: UserAdapter private lateinit var databaseRef: DatabaseReference override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView = findViewById(R.id.recyclerView) recyclerView.layoutManager = LinearLayoutManager(this) userList = arrayListOf() userAdapter = UserAdapter(userList) recyclerView.adapter = userAdapter databaseRef = FirebaseDatabase.getInstance().getReference("users") fetchUserData() } private fun fetchUserData() { databaseRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { userList.clear() for (userSnap in snapshot.children) { val user = userSnap.getValue(User::class.java) user?.let { userList.add(it) } } userAdapter.notifyDataSetChanged() } override fun onCancelled(error: DatabaseError) { Toast.makeText(this@MainActivity, "Failed to fetch data", Toast.LENGTH_SHORT).show() } }) } }
Additional Tips
- Use
addValueEventListener()
instead ofaddListenerForSingleValueEvent()
for continuous updates. - Always call
notifyDataSetChanged()
after modifying the list.
For a deeper understanding of Firebase listeners and performance optimization, you can check the official Firebase documentation.