【问题标题】:I'm trying to retrieve data from a Firebase realtime database using a recyclerview in Kotlin but the App keeps on crashing when I load the data [duplicate]我正在尝试使用 Kotlin 中的 recyclerview 从 Firebase 实时数据库中检索数据,但是当我加载数据时应用程序不断崩溃 [重复]
【发布时间】:2021-01-14 15:30:58
【问题描述】:

我的主要活动是这样的

private lateinit var database:FirebaseDatabase
private lateinit var reference: DatabaseReference

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    database = FirebaseDatabase.getInstance()
    reference = database.getReference("Users")

    val btnTwo: Button = findViewById(R.id.button2)
    btnTwo.setOnClickListener {
        startActivity(Intent(applicationContext, Results::class.java))
    }
    val btn: Button = findViewById(R.id.button)
    btn.setOnClickListener {
        sendData()
    }
}

private fun sendData()
{
    val name = findViewById<EditText>(R.id.et_name).text.toString().trim()
    val notes = findViewById<EditText>(R.id.et_notes).text.toString().trim()

    if (name.isNotEmpty()&&notes.isNotEmpty())
    {
        val model = DatabaseModel(name, notes)
        val id = reference.push().key

        reference.child(id!!).setValue(model)
        findViewById<EditText>(R.id.et_name).setText("")
        findViewById<EditText>(R.id.et_notes).setText("")
    }
    else{
        Toast.makeText(applicationContext, "All fields required",Toast.LENGTH_LONG).show()
    }
}

我的DatabaseModel是这样的

    class DatabaseModel(var name: String, var notes: String) {
    }

我的适配器是这样的

class DataAdapter (private val list: ArrayList<DatabaseModel>) 
:RecyclerView.Adapter<DataAdapter.ViewHolder>() {

class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
    var nName: TextView = itemView.findViewById(R.id.tvName)
    var nNotes: TextView = itemView.findViewById(R.id.tvNotes)
}


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.recycler_card,parent,false))
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.nName.text = list[position].name
    holder.nNotes.text = list[position].notes
}

override fun getItemCount(): Int {
    return list.size
}
}

我的结果活动

class Results : AppCompatActivity() {

private lateinit var mRecyclerView: RecyclerView
private lateinit var database: FirebaseDatabase
private lateinit var reference: DatabaseReference

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_results)


    database = FirebaseDatabase.getInstance()
    reference = database.getReference("Users")
    mRecyclerView = findViewById(dataRecyclerview)

    getData()
}

private fun getData() {

    reference.addValueEventListener(object :ValueEventListener{

        override fun onDataChange(snapshot: DataSnapshot) {
            val list = ArrayList<DatabaseModel>()
                for (data in snapshot.children){
                    val model = data.getValue(DatabaseModel::class.java)
                    list.add(model as DatabaseModel)
                }
                if (list.size > 0){
                    val adapter = DataAdapter(list)
                    mRecyclerView.adapter = adapter
                }
        }

        override fun onCancelled(error: DatabaseError) {
            Log.e("cancel", error.toString())
        }
    })
}
}

崩溃堆栈

2021-01-15 22:21:24.352 7066-7066/com.munopa.fireman E/RecyclerView:未连接适配器;跳过布局 2021-01-15 22:21:24.671 7066-7066/com.munopa.fireman D/AndroidRuntime:关闭 VM 2021-01-15 22:21:24.674 7066-7066/com.munopa.fireman E/AndroidRuntime:致命异常:主要 进程:com.munopa.fireman,PID:7066 com.google.firebase.database.DatabaseException:类 com.munopa.fireman.DatabaseModel 未定义无参数构造函数。如果您使用 ProGuard,请确保未剥离这些构造函数。 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:570) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) 在 com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) 在 com.munopa.fireman.Results$getData$1.onDataChange(Results.kt:35) 在 com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) 在 com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) 在 com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2021-01-15 22:21:24.689 7066-7066/com.munopa.fireman I/Process:发送信号。 PID:7066 SIG:9

【问题讨论】:

  • 请发布崩溃堆栈跟踪。
  • 你为什么要对模型类 list.add(model as DatabaseModel) 进行类型转换,只需让你的列表有一个 databasemodel 作为数据类型

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


【解决方案1】:

这是您回答的可能解决方案,我想问题是因为您在 onDataChanged 中重新填充了列表,但将其设置为该代码块之外的适配器

private fun getData() {

   reference.addValueEventListener(object :ValueEventListener{

       override fun onDataChange(snapshot: DataSnapshot) {
           val list = ArrayList<DatabaseModel>()
               for (data in snapshot.children){
                   val model = data.getValue(DatabaseModel::class.java)
                   list.add(model)
               }

               if (list.size > 0){
                   val adapter = DataAdapter(list)
                   mRecyclerView.adapter = adapter
                }
              
             }

       override fun onCancelled(error: DatabaseError) {
           Log.e("cancel", error.toString())
       }
   })
}

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多