【发布时间】: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()&¬es.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