【问题标题】:Edit variables and use another class (Kotlin)编辑变量并使用另一个类 (Kotlin)
【发布时间】:2020-11-26 01:08:44
【问题描述】:

请帮助,程序无法运行。 我想更改变量 a 和 b 并将它们放在名称中 谢谢................................................. ................................................

class Asd(){
        lateinit var a: String
        lateinit var b: String
        var database = FirebaseDatabase.getInstance().getReference("RedCars")
            .child("20-8-2020 18:0")
            .addValueEventListener(object : ValueEventListener {
                override fun onCancelled(p0: DatabaseError) {

                }

                override fun onDataChange(p0: DataSnapshot) {
                    var map = p0.value as Map<String, Any>

                a = map["price"].toString()
                 b = map["pickup"].toString()
            }

        })
}


public class MyCustomAdapter(context: Context): BaseAdapter(){

    private val mContext: Context

    val d = Asd().a
    val h = Asd().b
    var names = arrayListOf<String>(
        d, h
    )

我试试这个:......

 public class MyCustomAdapter(context: Context): BaseAdapter(){

    lateinit var a: String
    lateinit var b: String
    var database = FirebaseDatabase.getInstance().getReference("RedCars")
        .child("20-8-2020 18:0")
        .addValueEventListener(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(p0: DataSnapshot) {
                var map = p0.value as Map<String, Any>
                
                a = map["price"].toString()
                b = map["pickup"].toString()
            }

        })

    private val mContext: Context

    var names = arrayListOf<String>(
        a, b
    )

Logcat 错误:.................................................. ........

2020-08-05 22:03:16.024 9227-9227/com.example.redcars E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.redcars, PID: 9227
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.redcars/com.example.redcars.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property a has not been initialized
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3895)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4074)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
    at android.os.Handler.dispatchMessage(Handler.java:110)
    at android.os.Looper.loop(Looper.java:219)
    at android.app.ActivityThread.main(ActivityThread.java:8347)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
 Caused by: kotlin.UninitializedPropertyAccessException: lateinit property a has not been initialized
    at com.example.redcars.MainActivity$MyCustomAdapter.<init>(MainActivity.kt:133)
    at com.example.redcars.MainActivity.onCreate(MainActivity.kt:47)
    at android.app.Activity.performCreate(Activity.java:8085)
    at android.app.Activity.performCreate(Activity.java:8073)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3868)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4074) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473) 
    at android.os.Handler.dispatchMessage(Handler.java:110) 
    at android.os.Looper.loop(Looper.java:219) 
    at android.app.ActivityThread.main(ActivityThread.java:8347) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055) 

这在 MainActivity 中有:

listView.adapter = MyCustomAdapter(this)

【问题讨论】:

  • 能否请您提供任何错误日志以及代码的实际输出,以便我们更轻松地了解您的问题。
  • 我编辑了帖子
  • 对我来说这看起来是因为您在变量中定义了数据库,它的代码永远不会运行,并且您在初始化之前访问 a 和 b 变量,如果您尝试过 val d = Asd() 然后下一行d.database 然后下一行d.a 你可能会在第一次使用时解决这个问题,另一种情况可能是自类初始化以来数据库中发生了 0 次更改,因此它从未收到值。在这种情况下,可空值可能会更好。
  • 不识别数据库 | public class MyCustomAdapter(context: Context): BaseAdapter(){ private val mContext: Context val d = Asd() d.database d.a var names = arrayListOf&lt;String&gt;( a )
  • 您不能以这种方式引用类主体中的值,您可能希望在 init 块中执行此操作,例如:init { d.database d.a }

标签: android firebase kotlin firebase-realtime-database android-adapter


【解决方案1】:

您应该仅在初始化后使用lateinit 属性。所以我建议将names数组的初始化移动到ValueEventListener

public class MyCustomAdapter(context: Context): BaseAdapter(){

    lateinit var a: String
    lateinit var b: String
    lateinit var names: ArrayList<String>

    // or you can use MutableList
    // var namesMutable: MutableList<String> = mutableListOf()


    var database = FirebaseDatabase.getInstance().getReference("RedCars")
        .child("20-8-2020 18:0")
        .addValueEventListener(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(p0: DataSnapshot) {
                var map = p0.value as Map<String, Any>
                
                a = map["price"].toString()
                b = map["pickup"].toString()

                // INITIALIZE THE ARRAY HERE

                names = arrayListOf<String>(a, b)
                // namesMutable.add(a)
                // namesMutable.add(b)
                // notifyDatasetChanged()
            }

        })

    // ...
}

【讨论】:

  • 不工作Logcat:kotlin.UninitializedPropertyAccessException: lateinit property names has not been initialized
  • 请帮助:D.
  • 你在哪里使用names数组?
  • ListView 适配器。因为我想要带有许多实时数据库数据的 firebase listView。
  • 请看我编辑的答案:你可以尝试使用MutableList类型而不是ArrayList
猜你喜欢
  • 2020-03-28
  • 2013-03-23
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
相关资源
最近更新 更多