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!

  • Muestra un fragment en un widget de Android
  • Cómo importar un directory / package completo en Intellij para fines de testing
  • Usar condición para seleccionar la propiedad de sorting en Kotlin
  • Usar la class Kotlin en Java: no se puede encontrar el símbolo
  • ¿Cómo paso solo un parámetro a una function cuando espera dos?
  • Cuándo es posible omitir el tipo de devolución en Kotlin
  • Tengo que reiniciar IDE para ejecutar testings
  • Kotlin, problema de condición de carrera
  • ¿Funciones de extensión Kotlin contra funciones miembro?
  • ¿Se puede utilizar javascript generado a partir de fonts de Kotlin en JVM?
  • ¿Hay alguna reference para la complejidad del time de la biblioteca Kotlin Standard Collection?