1

So, I assigned my var spinner array to go fetch data from my document in firestore, but this is the result I get.

This is my current activity. I can make it work if I assign strings, but ultimately i want to load data from my Documents like I am trying to do right now.

This is my firestore setup.

Any reasons why? Thanks

var db = FirebaseFirestore.getInstance()



var spinnerArray = arrayOf(db.collection("KitList")
           .get()
           .addOnCompleteListener { task ->
               if (task.isSuccessful) {
                   for (document in task.result) {
                       Log.d("weight05", document.id + " => " + document.data)
                   }
               } else {
                   Log.w("error", "Error getting documents.", task.exception)
               }
           })

var newKitList = mutableListOf<String>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_new_kit_list)
    var addButton = addKitItemBtn

    val spinner = newKitItemSpinner
    val spinnerArrayAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, spinnerArray)
    //selected item will look like a spinner set from XML
    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    spinner.adapter = spinnerArrayAdapter

    val kitList = newKistListView
    val listViewAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, newKitList)
    kitList.adapter = listViewAdapter

    addButton.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View?) {
            val selectedItem = spinner.selectedItem.toString()
            newKitList.add(selectedItem)
            listViewAdapter.notifyDataSetChanged()
        }
    })

==============

EDIT

var spinnerArray: Array<Task<QuerySnapshot>> = arrayOf(db.collection("KitList").get()
       .addOnCompleteListener { task ->
           if (task.isSuccessful) {
               spinnerArray = task.result as Array<Task<QuerySnapshot>> //or however you get your document array
               for (document in task.result) {
                   Log.d("weight05", document.id + " => " + document.data)
               }
           } else {
               Log.w("error", "Error getting documents.", task.exception)
           }
       })
AndyFire
  • 11
  • 3

1 Answers1

0

Hey Andy I have not used FireStore yet but have experience on Firebase Database and Kotlin. And by my experience I can clearly tell you that you won't receive your array directly as fetching of data is not done on Main thread. Currently your spinnerArray holds reference to Firebase task that is why your spinner shows such text.

To get your array in your spinnerArray variable, you need to get it when your task is successful i.e. somewhat like this

EDIT: Remove your var spinnerArray initialization and do as I have added spinner's adapter.

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_new_kit_list)
var addButton = addKitItemBtn

val spinner = newKitItemSpinner
val spinnerArrayAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, spinnerArray)
//selected item will look like a spinner set from XML
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = spinnerArrayAdapter

val kitList = newKistListView
val listViewAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, newKitList)
kitList.adapter = listViewAdapter

addButton.setOnClickListener(object : View.OnClickListener {
    override fun onClick(v: View?) {
        val selectedItem = spinner.selectedItem.toString()
        newKitList.add(selectedItem)
        listViewAdapter.notifyDataSetChanged()
    }
})
db.collection("KitList")
       .get()
       .addOnCompleteListener { task ->
           if (task.isSuccessful) {
               spinnerArray = task.result //or however you get your document array
               var spinnerArray = task.result as Array<Task<QuerySnapshot>>
               val spinnerArrayAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, spinnerArray)
               //selected item will look like a spinner set from XML
               spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
               spinner.adapter = spinnerArrayAdapter
               for (document in task.result) {
                   Log.d("weight05", document.id + " => " + document.data)
               }
           } else {
               Log.w("error", "Error getting documents.", task.exception)
           }
       }
}

Call this piece of code inside onCreate and initialize spinnerArray as nullable property

nitinkumarp
  • 2,120
  • 1
  • 21
  • 30