【问题标题】:Android Firestore spinner not loading my documentAndroid Firestore 微调器未加载我的文档
【发布时间】:2017-10-04 11:25:44
【问题描述】:

所以,我分配了我的 var spinner 数组来从我在 firestore 中的文档中获取数据,但这是我得到的 。

这是我目前的活动。如果我分配字符串,我可以让它工作,但最终我想从我的文档中加载数据,就像我现在正在尝试做的那样。

这是我的 设置。

有什么原因吗? 谢谢

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()
        }
    })

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

编辑

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)
           }
       })

【问题讨论】:

    标签: android kotlin spinner google-cloud-firestore


    【解决方案1】:

    嘿,安迪,我还没有使用过 FireStore,但有使用 Firebase 数据库和 Kotlin 的经验。根据我的经验,我可以清楚地告诉你,你不会直接收到你的数组,因为获取数据不是在主线程上完成的。目前您的 spinnerArray 持有对 Firebase 任务的引用,这就是您的微调器显示此类文本的原因。

    要将您的数组放入您的 spinnerArray 变量中,您需要在任务成功时获取它,即有点像这样

    编辑: 删除您的 var spinnerArray 初始化,并按照我添加微调器的适配器进行操作。

    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)
               }
           }
    }
    

    在 onCreate 中调用这段代码并将 spinnerArray 初始化为可空属性

    【讨论】:

    • 您好,感谢您的回复。我确实尝试过,但在 if 语句中的 spinnerArray 上出现错误。 “类型检查遇到了递归问题”。我将该代码放在我的 var spinnerArray 中。这就是我应该做的对吗?
    • 我这样做了,但仍然得到一个奇怪的结果(看看我的编辑)谢谢
    • 在 .result 上必须添加这个 var spinnerArray = task.result as Array> 错了吗?
    • 有什么想法吗? :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多