Firebase no obtiene datos del método onDataChange

Entiendo que Firebase obtiene los datos de manera asíncrona y estoy tratando de configurar los datos antes de que se carguen en mi adaptador recyclerView para que se muestren en la vista recycler. Pero cuando abro la aplicación, solo obtiene la cadena "VACÍA" que configuré inicialmente, y parece que Firebase ni siquiera va al método onDataChange

CoursesFragment.kt

class CoursesFragment : android.support.v4.app.Fragment(), Contract.View { val TAG: String = CoursesFragment::class.java.name val presenter: Contract.Presenter.CoursePresenter = CoursePresenter(this) var tempDataList: MutableList<String> = mutableListOf() var dataArray: Array<String> = arrayOf("EMPTY") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) tempDataList = presenter.retrieveCourseNames() for (i in 0 until tempDataList.size) dataArray[i] = tempDataList[i] } override fun onCreateView(inflater: android.view.LayoutInflater?, container: android.view.ViewGroup?, savedInstanceState: Bundle?): android.view.View? { // Inflate the layout for this fragment val v = inflater!!.inflate(R.layout.fragment_courses, container, false) // Gets cardview widget and sets property val rView = v.findViewById<RecyclerView>(R.id.recyclerView_courses) rView.setHasFixedSize(true) // Creates the 2 column recycler view with the cards val layoutMan = GridLayoutManager(context, 1) rView.layoutManager = layoutMan // Sets up cardview in recycler view val adapter = CourseRecyclerAdapter(dataArray, presenter) adapter.notifyDataSetChanged() rView.adapter = adapter // actually inflates view return v } // ======================== INTERFACE OVERRIDE METHODS ======================== // CourseContract override fun showToastMessage(message: String) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show() } // ======================== USER METHODS ======================== // New Instance Method companion object { fun newInstance(page: Int = 0): CoursesFragment { val argPage: String = "ARG_PAGE" val args: Bundle = Bundle() args.putInt(argPage, page) val fragment = CoursesFragment() fragment.arguments = args return fragment } } } 

CoursePresenter.kt

 class CoursePresenter(val courseView: Contract.View) : Contract.Presenter.CoursePresenter { val courseInstance = com.alexoladele.cvap.MVP.Course.Model.Course() override fun retrieveCourseNames(): MutableList<String> { val returnList: MutableList<String> = mutableListOf() courseInstance.getCourseNamesFromDB(object : MyCallBack{ override fun doCallback(dbValue: String) { returnList.add(dbValue) } }) return returnList } fun testToast() { courseView.showToastMessage("TOAST TEST") } override fun onCourseClick(cardPosition: Int) { testToast() } } 

Course.kt

 class Course (val name: String = "GENERIC", val content: String = "PLACEHOLDER") : Contract.Model.CourseModel { val dbReference: DatabaseReference = FirebaseDatabase.getInstance().reference val courseRef = dbReference.child("Course") val courseNames = mutableListOf<String>() override fun getCourseNamesFromDB(callback: MyCallBack) { courseRef.addValueEventListener(object : ValueEventListener { override fun onCancelled(p0: DatabaseError?) { // TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onDataChange(p0: DataSnapshot) { val tempString = p0.value as String Log.d(TAG, "onDataChange: Value from DB is: $tempString"); callback.doCallback(tempString) } }) } } interface MyCallBack { fun doCallback(dbValue: String) } 

EDITAR: Lo he intentado en el CoursePresenter

 override fun retrieveCourseNames(dataArray: Array<String>): Array<String> { // val returnList: MutableList<String> = mutableListOf() courseInstance.getCourseNamesFromDB(object : MyCallBack{ override fun doCallback(dbValue: String) { val returnList = mutableListOf<String>() returnList.add(dbValue) for (i in 0 until returnList.size) dataArray[i] = returnList[i] } }) return dataArray } 

Para resolver esto, necesita declarar y usar val returnList dentro de la function doCallback sobrescrita en su file CoursePresenter.kt . De esta forma no obtendrás Cadena vacía.

Espero eso ayude.

Lo arreglé eliminando completamente la callback. Configuré el adaptador recyclerView dentro del método onDataChange (), por lo tanto, no estoy configurando el layout antes de get datos que podrían hacer que se cargue un poco lento y probablemente viole MVP, ¡pero funciona!

  • Complemento de estudio Android con id: 'kotlin-android-extensions'
  • Kotlin Android imprime en la console
  • Seguridad de spring. Redirigir a la página protegida después de la authentication
  • Comparador como lambda
  • Pasar un object detector como un parámetro de function en kotlin
  • TimeZone no muestra
  • UNRESOLVED_REFERENCE Referencia no resuelta: isInitialized
  • Diferencia sutil cuando se ejecuta en intellij y ejecutando jar
  • ¿Cómo se simula emitir 2 streams infinitas observables y tener otras observables que las fusionan y amortiguan cada 10 segundos?
  • ¿Por qué == crea error de compilation en diferentes types en Kotlin?
  • Invocar sobrecarga de operador y operador en Kotlin