Cómo mostrar elementos de carga mientras se obtienen los datos de Firebase en android kotlin
Tengo un RecyclerView y mi Fragment. Estoy obteniendo datos de Firebase Realtime Database en un RecyclerView.
Necesito agregar un efecto de carga mientras se cargan los datos. ¿Cómo puedo hacer esto?
Código de mi Fragmento:
private var _binding: FragmentDayDetailBinding? = null
private val binding get() = _binding!!
private var ref: DatabaseReference? = null
private lateinit var adapter: DayDetailAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDayDetailBinding.inflate(inflater, container, false)
setupRecyclerView()
initDatabase()
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
readFromDatabase()
}
private fun setupRecyclerView() {
adapter = DayDetailAdapter()
binding.recyclerView.layoutManager = LinearLayoutManager(requireContext())
binding.recyclerView.adapter = adapter
}
private fun initDatabase() {
FirebaseApp.initializeApp(requireContext())
ref = FirebaseDatabase.getInstance()
.getReference("IMIT")
.child("groups")
}
private fun readFromDatabase() {
ref?.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val list = ArrayList<day>()
for (daySnapshot in snapshot.children) {
val day = daySnapshot.getValue(Day::class.java)
list.add(day!!)
}
adapter.submitList(list)
} else {
binding.apply {
lrDbEmpty.visibility = View.VISIBLE
recyclerView.visibility = View.INVISIBLE
}
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
Código del adaptador de RecyclerView:
“`
class ViewHolder(private val binding: ItemSubjectDetailBinding): RecyclerView.ViewHolder(binding.root) {
<pre><code>fun bind(day: Day) = with(binding) {
tvSubject.text = day.subject
tvInfo.text = "${day.teacher}, ${day.type}"
tvTime.text = day.time
tvAud.text = day.classroom
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = ItemSubjectDetailBinding.inflate(layoutInflater, parent, false)
return ViewHolder(binding)
}
}
</code></pre>
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
with(holder) {
bind(getItem(position))
}
}
class ItemComparator: DiffUtil.ItemCallback<day>() {
override fun areItemsTheSame(oldItem: Day, newItem: Day): Boolean {
return oldItem == newItem
}
<pre><code>override fun areContentsTheSame(oldItem: Day, newItem: Day): Boolean {
return oldItem == newItem
}
</code></pre>
}
“`
davy.ai
Para agregar un efecto de carga mientras los datos se cargan desde Firebase Realtime Database en un RecyclerView, puede seguir los siguientes pasos:
En la función
readFromDatabase()
en su Fragmento, agregue el siguiente código al principio de la función:Esto hará que el RecyclerView sea invisible y la barra de progreso sea visible mientras se cargan los datos.
En la función
onDataChange()
en su ValueEventListener, agregue el siguiente código después de que el adaptador se actualice con los nuevos datos:Esto hará que el RecyclerView sea visible nuevamente y ocultará la barra de progreso.
Su función
readFromDatabase()
actualizada se verá así:“`
private fun readFromDatabase() {
binding.progressBar.visibility = View.VISIBLE
binding.recyclerView.visibility = View.INVISIBLE
}
“`