【问题标题】:why am I getting an empty arraylist in Kotlin Fragment?为什么我在 Kotlin 片段中得到一个空数组列表?
【发布时间】:2020-05-09 14:51:19
【问题描述】:

我有片段和一个数组列表,我正在尝试在函数内向这个数组列表添加值。当我在函数内打印它时,它可以工作。但是,当我尝试在函数 Array List 之外打印它时,它是空的。

我可以看到我在这里遗漏了一个逻辑。

谁能帮帮我我哪里做错了?

这是片段文件。

class HourlySalesFragment : Fragment() {

val tt = arrayListOf<Double>()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle? ): View? {

 //some other code here.

 val valueEventListener08_30 = object : ValueEventListener {


        var subtotalList = arrayListOf<Double>()


        override fun onDataChange(p0: DataSnapshot) {
            if (p0.exists()) {
                for(ds in p0.children) {
                    println("data snapshot "+ds)

                    val subtotal = ds.child("subTotal").getValue(Double::class.java)!!

                    subtotalList.add(subtotal)
                    textSubTotal8_30.text = subtotalList.sum().toString()

                }

                tt.add(subtotalList.sum())
                println("ttt 8:30 "+tt)
            }
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
        }
    }
    println("ttt outside"+tt)

这就是我得到的结果。

ttt outside[]
ttt 8:30 [5.0]

提前致谢。

【问题讨论】:

  • onDataChange 回调之前调用外部打印,因此此时tt 为空。你想达到什么目标?
  • 我想在onDataChange 中填充一个数组列表并在onDataChange 之外获取这些值,以便我可以将它用于其他目的。

标签: android variables android-fragments kotlin arraylist


【解决方案1】:

因为您的 println("ttt outside"+tt) 语句在异步方法完成执行之前首先执行。

val valueEventListener08_30 = object : ValueEventListener {


        var subtotalList = arrayListOf<Double>()


        override fun onDataChange(p0: DataSnapshot) {
            if (p0.exists()) {
                for(ds in p0.children) {
                    println("data snapshot "+ds)

                    val subtotal = ds.child("subTotal").getValue(Double::class.java)!!

                    subtotalList.add(subtotal)
                    textSubTotal8_30.text = subtotalList.sum().toString()

                }

                tt.add(subtotalList.sum())
                println("ttt 8:30 "+tt)
                useArray()
            }
        }

        override fun onCancelled(databaseError: DatabaseError) {
            Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
        }
    }




   fun useArray(){
        println("ttt outside"+tt)

    }

【讨论】:

  • 我明白了,谢谢你的回复。有什么方法可以获取那些tt 值吗?
  • 是的,只有在 onDataChange() 方法完成执行后才能使用该数组列表值,即该方法的最后一条语句。
  • 谢谢,如果我想在ValueEventListener之外获取这些值呢?
  • 如果要在 ValueEventListener 之外的其他方法中使用该数组,则必须在异步方法完成执行后调用该方法。这就是异步方法的工作原理,否则您将无法获得更新的数据,请参阅我的更新答案。
  • 谢谢尼哈尔。但这是它现在给出的问题。 unresolved reference: useArray 我已将 useArray() 函数移到 valueeventlistener 之前,现在它可以工作了。谢谢一百万。
猜你喜欢
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多