0

I am trying to display notes in my recycler view. the note body is like this: Note Title in one text view Note Content in the other text view below the title

So, this will get displayed in one Item and then the next note in the next item. But the issue is that, one item is containing the note title, and the other one is containing its content.

Here is my NotesAdapter Class:

class NotesAdapter(private var noteView: ArrayList<String>):
    RecyclerView.Adapter<NotesAdapter.MyViewHolder>() {

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val noteView : View =LayoutInflater.from(parent.context).inflate(R.layout.note_card,parent,false)
        return MyViewHolder(noteView)
    }

   override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    //Set data here

       holder.itemView.apply {
          note_title_TV.text = noteView[position]
       
          note_content_TV.text = noteView[position]
       }

   }

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

My Main Activity Class (This class contains my firebase code too, as I am reading data from there and storing that into a list) :

class HomeActivity : AppCompatActivity() {

    var nList = ArrayList<String>();

    private lateinit var recyclerView: RecyclerView
    private lateinit var viewAdapter: RecyclerView.Adapter<*>
    private lateinit var viewManager: RecyclerView.LayoutManager

    val rootReference = Firebase.database.reference //app root in firebase database
    val currentUser = FirebaseAuth.getInstance().currentUser
    val uid = currentUser?.uid.toString()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        //Show user's name in welcome message
        //get the name of user from firebase
        val nameFromFirebase: FirebaseDatabase = FirebaseDatabase.getInstance()


        var nameReference = rootReference.child("users").child(uid).child("name")
        nameReference.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                val result = snapshot.value
                tv_User_Name.text = result.toString()
            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }

        })

        btn_createNote.setOnClickListener {
            Intent(this, AddNoteActivity::class.java).also {
                startActivity(it)
            }
        }

        //Read notes from database
        readNotesFromFirebaseDatabase()

        //Updating Layout to display notes in RecyclerView
        recyclerView = findViewById<RecyclerView>(R.id.rv_displayNotesInRecyclerView)
        recyclerView.setHasFixedSize(true)
        recyclerView.layoutManager=LinearLayoutManager(this)

        //RecyclerView Adapter being passed the notes list
        val adapter = NotesAdapter(nList)
        rv_displayNotesInRecyclerView.adapter = adapter

        }


    fun readNotesFromFirebaseDatabase(){
        val noteReference = rootReference.child("users").child(uid).child("Notes")
        noteReference.addValueEventListener(object:ValueEventListener{

            override fun onDataChange(snapshot: DataSnapshot) {
                val noteContent = snapshot.child("noteContent").getValue(String::class.java)
                val noteTitle = snapshot.child("noteTitle").getValue(String::class.java)


                //Add Notes to the ArrayList of Notes
                nList.add(noteTitle.toString())
                nList.add(noteContent.toString())
            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }
        })

    }
}

Note_item XML Layout File:

<?xml version="1.0" encoding="UTF-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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="wrap_content">


    <androidx.cardview.widget.CardView
        android:id="@+id/prompt_cardview"
        android:layout_width="390dp"
        android:layout_height="89dp"

        android:layout_marginLeft="10dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:minHeight="120dp"
        app:cardCornerRadius="15dp"
        app:cardElevation="3dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="384dp"
            android:layout_height="match_parent"
            android:minHeight="120dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintTop_toTopOf="parent">

            <TextView
                android:id="@+id/note_title_TV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="8dp"
                android:fontFamily="@font/lato"
                android:lineHeight="22dp"
                android:text="Title"
                android:textAlignment="gravity"
                android:textColor="#4F4B4B"
                android:textSize="18sp"
                android:textStyle="bold"
                android:paddingLeft="2dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.037"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.0" />

            <TextView
                android:id="@+id/note_content_TV"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:layout_marginStart="12dp"
                android:layout_marginTop="10dp"
                android:layout_marginEnd="8dp"
                android:fontFamily="@font/lato"
                android:paddingLeft="5dp"
                android:lineHeight="14dp"
                android:singleLine="false"
                android:text="@string/some_comments_are_here_to_stay_you_know"
                android:textAlignment="center"
                android:textColor=" #877B7B"
                android:textSize="12sp"
                android:textStyle="bold"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/note_title_TV"
                app:layout_constraintVertical_bias="0.0" />

            <ImageButton
                android:id="@+id/btn_edit"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp"
                android:background="@drawable/round_button_edit"
                android:src="@drawable/icon_btn_edit"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/btn_delete"
                app:layout_constraintHorizontal_bias="0.972"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/note_content_TV"
                app:layout_constraintVertical_bias="1.0" />

            <ImageButton
                android:id="@+id/btn_delete"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp"
                android:background="@drawable/round_button_delete"
                android:src="@drawable/icon_btn_delete"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.983"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/note_content_TV"
                app:layout_constraintVertical_bias="1.0" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.cardview.widget.CardView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

I Also have made a Note Class (if it may be of any assistance) :

class Note (val noteContent:String , val noteTitle: String) {

}

This is my Firebase Database Note Entry, 1:https://i.stack.imgur.com/bixCW.png

Now, I am getting this output, 2: https://i.stack.imgur.com/VV7l7.png

P.S I know there are some posts regarding this like this one: How to create Multiple View Type in Recycler View but they are in Java and I am getting stuck while converting that here.

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
viper25
  • 15
  • 7
  • Several things are going on with your code. Start by taking a look at the `nlist` ArrayList. In `readNotesFromFirebaseDatabase()` you are assigning the title and the content to separate entries. In `onBindViewHolder()` you are assigning a single value in the ArrayList to both _TextViews_. You need to associate the title and the content and make sure that you assign the _TextViews_ correctly. As things stand, each title stands apart from each content and you are seeing the results. Place the app in debug mode and take a look at these two areas and you should see what I mean. – Cheticamp Oct 16 '20 at 12:33
  • @Cheticamp thanks for looking through the code. But the problem is solved. – viper25 Oct 16 '20 at 13:03

2 Answers2

1

Try this:

Create a model class with 2 variables

class Notes{
   val title: String = ""
   val content: String = ""
}

after that creates an array list using that model class instead of String which looks like this:

 val list: MutableList<Notes> = Notes()
 val nots : Notes = Notes()
 notes.title = "test"
 notes.content = "Good Work!"
 list.add(notes)

Once your list is created pass that list to adapter and you are good to go

class NotesAdapter(private var list: ArrayList<Note>):
     RecyclerView.Adapter<NotesAdapter.MyViewHolder>() {

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

     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
         val noteView : View = LayoutInflater.from(parent.context).inflate(R.layout.note_card,parent,false)
         return MyViewHolder(noteView)
     }

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

        holder.itemView.apply {
            note_title_TV.text = list[position].title
            note_content_TV.text = list[position].content
        }
     }

     override fun getItemCount(): Int {
         return list.size
     }
 }
Mohak Shah
  • 518
  • 3
  • 12
0

The problem is solved.

Change the ArrayList from String to Note And in the Main Activity Class, edited this block of code:

//Add Notes to the ArrayList of Notes

var note : Note

note.noteContent = noteTitle.toString()
 note.noteTitle = noteTitle.toString()

In the NotesAdapter Class (Posting the complete correct code):

class NotesAdapter(private var noteView: ArrayList<Note>):
    RecyclerView.Adapter<NotesAdapter.MyViewHolder>() {

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val noteView : View = LayoutInflater.from(parent.context).inflate(R.layout.note_card,parent,false)
        return MyViewHolder(noteView)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        //Set data here

       holder.itemView.apply {
           note_title_TV.text = noteView[position].noteContent

           note_content_TV.text = noteView[position].noteTitle
       }

    }

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


}
viper25
  • 15
  • 7