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 списка), а не меняете само значение переменной.