База данных Firebase реального времени всегда возвращает нулевой список при использовании viewmodel/livedata. Но если я использую тот же код в самом Fragment, он работает. это моя модель представления
package com.example.taxinfo.fragments
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.Navigation
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.taxinfo.R
import com.example.taxinfo.adapters.HomeAdapter
import com.example.taxinfo.databinding.FragmentHomeBinding
import com.example.taxinfo.modelClass.TaxDetails
import com.example.taxinfo.viewmodel.UserViewModel
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
class HomeFragment : Fragment() {
private var _binding : FragmentHomeBinding? = null
private val binding get() = _binding!!
private lateinit var recyclerView: RecyclerView
private lateinit var reference: DatabaseReference
private lateinit var list : ArrayList
private val viewModel : UserViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
_binding = FragmentHomeBinding.inflate(inflater, container, false)
binding.plusButton.setOnClickListener {
Navigation.findNavController(it).navigate(R.id.action_homeFragment_to_accountFragment)
}
// recyclerview
viewModel.getTaxDetails(requireContext())
viewModel.taxDetails.observe(viewLifecycleOwner, Observer {
if (it != null) list = it
})
recyclerView.adapter = HomeAdapter(requireContext(), list)
recyclerView = binding.recyclerView
recyclerView.adapter?.notifyDataSetChanged()
recyclerView.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
list() //calling list adapter
return binding.root
}
private fun list() {
reference = FirebaseDatabase.getInstance().getReference("Tax Details")
val list = arrayListOf()
reference.addValueEventListener(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()){
for(snap in snapshot.children){
val taxData = snap.getValue(TaxDetails::class.java)
list.add(taxData!!)
}
try {
recyclerView.adapter = HomeAdapter(requireContext(), list)
}catch (e : NullPointerException){
Log.d("TAG", e.localizedMessage)
}
}
}
override fun onCancelled(error: DatabaseError) {
Toast.makeText(requireContext(), error.toException().localizedMessage, Toast.LENGTH_SHORT).show()
}
})
}
override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
}
Если я попытаюсь получить список из базы данных, используя функцию во фрагменте, это сработает, но если я использую наблюдателя Viewmodel для получения списка, он вернет ноль и приложение выйдет из строя
База данных Firebase реального времени всегда возвращает нулевой список при использовании viewmodel/livedata. Но если я использую тот же код в самом Fragment, он работает. [b]это моя модель представления[/b] [code]package com.example.taxinfo.viewmodel
class UserViewModel(val repo : UserRepo) : ViewModel() {
private lateinit var reference: DatabaseReference
private val _taxDetails = MutableLiveData() val taxDetails : LiveData get() = _taxDetails fun getTaxDetails(context: Context){
val list = arrayListOf(TaxDetails("1000", "HouseLoan")) reference = FirebaseDatabase.getInstance().getReference().child("Tax Details")
reference.addListenerForSingleValueEvent(object : ValueEventListener{ override fun onDataChange(snapshot: DataSnapshot) { if (snapshot.exists()){ for(snap in snapshot.children){ val taxData = snap.getValue(TaxDetails::class.java) if (taxData != null) list.add(taxData) } _taxDetails.value = list } }
private var _binding : FragmentHomeBinding? = null private val binding get() = _binding!!
private lateinit var recyclerView: RecyclerView
private lateinit var reference: DatabaseReference
private lateinit var list : ArrayList
private val viewModel : UserViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment
private fun list() { reference = FirebaseDatabase.getInstance().getReference("Tax Details") val list = arrayListOf()
reference.addValueEventListener(object : ValueEventListener{ override fun onDataChange(snapshot: DataSnapshot) { if (snapshot.exists()){ for(snap in snapshot.children){ val taxData = snap.getValue(TaxDetails::class.java) list.add(taxData!!) } try { recyclerView.adapter = HomeAdapter(requireContext(), list) }catch (e : NullPointerException){ Log.d("TAG", e.localizedMessage) }
} }
override fun onCancelled(error: DatabaseError) { Toast.makeText(requireContext(), error.toException().localizedMessage, Toast.LENGTH_SHORT).show() } })
}
override fun onDestroyView() { _binding = null super.onDestroyView() } } [/code] Если я попытаюсь получить список из базы данных, используя функцию во фрагменте, это сработает, но если я использую наблюдателя Viewmodel для получения списка, он вернет ноль и приложение выйдет из строя