I have a fragment in Kotlin and I am trying to get data from Firebase. I already get data from Firebase but the code does not works when it comes to add datas to “myPetsList” list. Here is my your textFragment and Adapter code:
fragment
package com.example.touchpet
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.databinding.DataBindingUtil
import com.example.touchpet.databinding.FragmentMyPetsBinding
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.*
import com.example.touchpet.MyPetsAdapter
private const val ARG_PARAM1 = "param1"
class MyPetsFragment : Fragment() {
private var param1: String? = null
private lateinit var binding: FragmentMyPetsBinding
private lateinit var myPetsList: ArrayList<Pet>
private lateinit var adapter: MyPetsAdapter
private lateinit var firebaseAuth: FirebaseAuth
private lateinit var db: FirebaseDatabase
private lateinit var petRef: DatabaseReference
private lateinit var cUser: User
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_my_pets,container,false)
firebaseAuth = FirebaseAuth.getInstance()
db = FirebaseDatabase.getInstance()
petRef = db.getReference("pet")
myPetsList= arrayListOf()
adapter= MyPetsAdapter(requireContext(),myPetsList)
binding.myPetsAdapter=adapter
getPetsData()
Log.d("DEBUG", "List size: ${myPetsList.size}")
return binding.root
}
fun getPetsData() {
val userId = firebaseAuth.currentUser?.uid
if (userId == null) {
Log.e("FirebaseAuth", "User is not logged in")
return
}
petRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
myPetsList.clear()
if (snapshot.exists()) {
for (petSnapshot in snapshot.children) {
val pet = petSnapshot.getValue(Pet::class.java)
Log.e("FirebasePet", "${pet?.pet_name.toString()}")
pet?.let { myPetsList.add(it) }
}
binding.myPetsAdapter?.updateItems(myPetsList) // Notify the adapter
} else {
Log.d("FirebaseData", "No pets found")
}
}
override fun onCancelled(error: DatabaseError) {
Log.e("FirebaseError", "Database error: ${error.message}", error.toException())
}
})
}
companion object {
@JvmStatic
fun newInstance(param1:String) =
MyPetsFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
}
}
}
package com.example.touchpet
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.touchpet.databinding.CardviewPetBinding
class MyPetsAdapter(private val mContext:Context, private var cardList: List<Pet?>)
:RecyclerView.Adapter<MyPetsAdapter.CardTasarimNesneleriTutucu>(){
private var listenerItems: onItemClickListener? = null
inner class CardTasarimNesneleriTutucu(cardTasarimBinding: CardviewPetBinding, private val listener: onItemClickListener?): RecyclerView.ViewHolder(cardTasarimBinding.root),
View.OnClickListener{
var cardTasarimBinding: CardviewPetBinding
init {
this.cardTasarimBinding = cardTasarimBinding
}
override fun onClick(v: View?) {
val position = adapterPosition
if (position != RecyclerView.NO_POSITION) {
listener?.onItemClick(position)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardTasarimNesneleriTutucu {
val layoutInflater = LayoutInflater.from(mContext)
val cardTasarimBinding = CardviewPetBinding.inflate(layoutInflater,parent,false)
return CardTasarimNesneleriTutucu(cardTasarimBinding,listenerItems)
}
override fun getItemCount(): Int {
return cardList.size
}
override fun onBindViewHolder(holder: MyPetsAdapter.CardTasarimNesneleriTutucu, position: Int) {
val card = cardList.get(position)
holder.cardTasarimBinding.myPetNesne = card
}
fun updateItems(newItems: List<Pet>) {
this.cardList = newItems
notifyDataSetChanged()
}
interface onItemClickListener {
fun onItemClick(position: Int)
}
fun setOnItemClickListener(listener: onItemClickListener) {
listenerItems = listener
}
`}“
I debugged lots of time and I could not catch any mistakes. The only problem was adding elements to “myPetsList”
New contributor
Mehmet Akif Çelebi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.