Home > other >  Recycler View Not Creating Views and Not Displaying Data
Recycler View Not Creating Views and Not Displaying Data

Time:06-25

So I am trying to create a simple Note App, where the user gives data, gets stored in a database, and is displayed using a recycler view. Up until now, I can confirm that data is being stored in my database, and that data is also being retrieved from it and being initialized to a variable in the adapter class, but for some reason, the Adapter's OnCreateViewHolder(), OnBindViewHolder() and getItemCount() functions are not being called even after notifying the adapter of the change in data. This is my MainActivity and Adapter class.

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: NoteViewModel

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

        val noteAdapter = NotesRVAdapter(this)

        notesRV.adapter = noteAdapter
        notesRV.layoutManager = LinearLayoutManager(this)

        viewModel = ViewModelProvider(this,ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(NoteViewModel::class.java)

        //access getAllNotes from NoteViewModel class from created instance
        viewModel.getAllNotes.observe(
            this,
            Observer { list ->
                list?.let {
                    Log.d("TAG","Observing")
                    NotesRVAdapter(this).updateList(it as ArrayList<NoteEntity>)
//                    Toast.makeText(this,"$it",Toast.LENGTH_LONG).show()
                }
            },
        )

    }

    fun createNote(view: View) {
        val intent = Intent(this,SecondActivity::class.java)   // for creating a note
        startActivity(intent)
    }
}

Adapter Class

class NotesRVAdapter(private val context: Context) : RecyclerView.Adapter<NotesRVAdapter.NotesVH>() {

    private var noteItem = ArrayList<NoteEntity>()

    inner class NotesVH(noteView: View): RecyclerView.ViewHolder(noteView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotesVH {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.note_item,parent,false)
        return NotesVH(view)
    }

    override fun onBindViewHolder(holder: NotesVH, position: Int) {

        holder.itemView.Heading.text = noteItem[position].heading
        holder.itemView.Description.text = noteItem[position].text
        holder.itemView.Priority.text = noteItem[position].priority.toString()

    }

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

    fun updateList(list: ArrayList<NoteEntity>){

        noteItem.clear()
        noteItem.addAll(list)
//        Toast.makeText(context,"${noteItem[0].text}",Toast.LENGTH_LONG).show()

        notifyDataSetChanged()
    }

}

The updateList function is getting called in mainactivity and the list is being passed in the noteitem and the toast also works, but that's it. All the override functions seem to be not working as I tried running a Log statement in them, but there was no entry for any Log in the Logcat.

I don't think there's a problem in the XML file as I could see the preview using the tools statement, but if someone needs to check it, here it is:

note_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:paddingHorizontal="30dp"
    android:paddingVertical="30dp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@ id/Heading"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintRight_toLeftOf="@id/Priority"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text = "Note Heading"
        android:textSize="35sp"
        android:textStyle="bold"
        android:textColor="@color/black"
        />

    <TextView
        android:id="@ id/Description"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/Heading"
        app:layout_constraintRight_toLeftOf="@id/Priority"
        tools:text="Description"
        android:textSize="25sp"
        android:textColor="@color/black"
        />

    <TextView
        android:id="@ id/Priority"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="1"
        android:textSize="60sp"
        android:textColor="@color/black"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@ id/notesRV"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_width="0dp"
        android:layout_height="0dp"
        tools:listitem="@layout/note_item"
        />

    <ImageView
            android:id="@ id/createNote"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginBottom="80dp"
            android:layout_marginRight="40dp"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@drawable/ic_baseline_add_24"
            android:onClick="createNote"
            />


</androidx.constraintlayout.widget.ConstraintLayout>

I would appreciate it if someone could help me with this issue. Thanks!

CodePudding user response:

you are creating a new adapter instance here which is not attached to your recyclerview

NotesRVAdapter(this).updateList(it as ArrayList<NoteEntity>)

change it to the one attached to your recyclerview and that will be

noteAdapter.updateList(it as ArrayList<NoteEntity>)
  • Related