RecyclerView не хочет обновляться, что делать и как это исправить?

MainActivity.kt

package codes.myappnotes

import android.annotation.SuppressLint
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import codes.myappnotes.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private val adapter = AdapterNote()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        init()
    }

    override fun onResume() {
        super.onResume()
        /*if (adapter.array.size != Notes.Array_Notes.size) {
            for (i in Notes.Array_Notes) {
                adapter.addNote(i)
            }
         }*/

        if (adapter.array.size == 0) {
            findViewById<TextView>(R.id.textView2).text = "Пусто"
        } else {
            findViewById<TextView>(R.id.textView2).text = ""
        }
    }

    fun addNoteButton(view: View) {
        val page = Intent(this, AddNoteActivity::class.java)
        startActivity(page)
     }

    @SuppressLint("CutPasteId")
    private fun init() {
        apply {
            findViewById<RecyclerView>(R.id.recyclerView).layoutManager = 
  GridLayoutManager(this@MainActivity, 1)
        findViewById<RecyclerView>(R.id.recyclerView).adapter = adapter
    }
}
}

AddNoteActivity.kt

package codes.myappnotes

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import codes.myappnotes.databinding.ActivityAddNoteBinding
import codes.myappnotes.db.DataBaseManager

class AddNoteActivity : AppCompatActivity() {
    private lateinit var binding: ActivityAddNoteBinding
    private val adapter = AdapterNote()
    private val db = DataBaseManager(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_add_note)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        binding = ActivityAddNoteBinding.inflate(layoutInflater)
        db.openDB()
        findViewById<Button>(R.id.createNote).setOnClickListener {
            addDataNotes()
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        /**  **/
        if (item.itemId == android.R.id.home) {
            finish()
        }

        return true
    }

    fun clearButton(view: View) {
        /** Этот метод отчищает поля ввода **/
        findViewById<TextView>(R.id.header_note).text = ""
        findViewById<TextView>(R.id.text_Note).text = ""
   }

   private fun addDataNotes() {
    /** Данный метод осуществляет создание экземпляра HolderView и далее добавляет данные **/
    val addHeaderNote = findViewById<EditText>(R.id.header_note)
    val addTextNote = findViewById<EditText>(R.id.text_Note)

    adapter.addNote(Note(addHeaderNote.text.toString(), addTextNote.text.toString()))
    finish()
}
}

AdapterNote.kt

package codes.myappnotes

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import codes.myappnotes.databinding.TemplateItemNoteBinding

class AdapterNote : RecyclerView.Adapter<AdapterNote.HolderView>() {
    var array = ArrayList<Note>()
        @SuppressLint("NotifyDataSetChanged")
        set(value) {
           field = value
           notifyDataSetChanged()
        }

    class HolderView(item: View): RecyclerView.ViewHolder(item) {
        private val binding = TemplateItemNoteBinding.bind(item)
        fun bind(note: Note) = with(binding) {
            headerNote.text = note.header
            textNote.text = note.text
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HolderView {
        /** Данный метод создаёт экземпляр класса HolderView **/
        val view = LayoutInflater.from(parent.context).inflate(R.layout.template_item_note, parent, false)
    return HolderView(view)
    }

    override fun onBindViewHolder(holder: HolderView, position: Int){
        /** Данный метод заполняет экземпляр класса HolderView данными **/
        holder.bind(array[position])
    }

    override fun getItemCount(): Int {
        /** Общее количество данных которое нужно вывести в RecyclerView **/
        return array.size
    }

    @SuppressLint("NotifyDataSetChanged")
    fun addNote(note: Note) {
        array.add(note)
    }
}

Ответы (1 шт):

Автор решения: ЮрийСПб

Вы не уведомляете адаптер о том, что данные изменяются.

Вы пытаетесь это делать, вызывая notifyDataSetChanged() в сеттере списка данных, однако этим сеттером никогда не пользуетесь.

Данные вы добавляете только в методе addNote - вот там и уведомляйте адаптер об изменениях. Сеттер переменной не будет вызываться, если вы меняете состояние объекта (в вашем случае - вызывая метод add списка), а не меняете само значение переменной.

→ Ссылка