0

My Main Activity is like this

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

My DatabaseModel is like this

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

My Adapter is like this

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

My Results Activity

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

The crash stack

2021-01-15 22:21:24.352 7066-7066/com.munopa.fireman E/RecyclerView: No adapter attached; skipping layout 2021-01-15 22:21:24.671 7066-7066/com.munopa.fireman D/AndroidRuntime: Shutting down VM 2021-01-15 22:21:24.674 7066-7066/com.munopa.fireman E/AndroidRuntime: FATAL EXCEPTION: main Process: com.munopa.fireman, PID: 7066 com.google.firebase.database.DatabaseException: Class com.munopa.fireman.DatabaseModel does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped. at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:570) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203) at com.munopa.fireman.Results$getData$1.onDataChange(Results.kt:35) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2021-01-15 22:21:24.689 7066-7066/com.munopa.fireman I/Process: Sending signal. PID: 7066 SIG: 9

  • 2
    Please post the crash stack trace. – Bink Jan 14 '21 at 15:40
  • why are you typecasting the model class list.add(model as DatabaseModel) , simply make your list have a databasemodel as data type <> – Taki Jan 14 '21 at 16:15

1 Answers1

0

Here is a possible solution for your answer and i guess the issue is because you re populating your list inside your onDataChanged but setting it to the adapter outside of that code block

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())
       }
   })
}
java_dude
  • 4,038
  • 9
  • 36
  • 61
Taki
  • 3,290
  • 1
  • 16
  • 41