База данных Firebase в реальном времени всегда возвращает нулевой список при использовании модели представленияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 База данных Firebase в реальном времени всегда возвращает нулевой список при использовании модели представления

Сообщение Anonymous »

База данных Firebase реального времени всегда возвращает нулевой список при использовании viewmodel/livedata. Но если я использую тот же код в самом Fragment, он работает.
это моя модель представления

Код: Выделить всё

package com.example.taxinfo.viewmodel

import android.content.Context
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.taxinfo.adapters.HomeAdapter
import com.example.taxinfo.modelClass.TaxDetails
import com.example.taxinfo.repository.UserRepo
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 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
}
}

override fun onCancelled(error: DatabaseError) {
Toast.makeText(context, error.toException().localizedMessage, Toast.LENGTH_SHORT).show()
}
})
}

fun saveTaxDetails(id : String, amount : String, itemSelected : String, context : Context, view : View){
repo.saveTaxDetails(id, amount, itemSelected, context, view )
}
}

Это мой фрагмент

Код: Выделить всё

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 для получения списка, он вернет ноль и приложение выйдет из строя

Подробнее здесь: https://stackoverflow.com/questions/787 ... -viewmodel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»