notifyDataSetChanged не обновляет RecyclerView, хотя ссылка на ArrayList не потеряна - PullRequest
0 голосов
/ 03 августа 2020

Я понимаю, что этот вопрос задавали МНОГО раз в SO, но все решения относятся к отсутствующей ссылке в моем Arraylist, который в настоящее время я (верю) сохраняет.

У меня есть адаптер следующего вида:

/**
 * [RecyclerView.Adapter] that can display a [Note].
 */
class MyNoteRecyclerViewAdapter(
    private var notes: ArrayList<Note>,
    private val onNoteSelectedListener: MainActivityContract.OnNoteSelectedListener
) : RecyclerView.Adapter<MyNoteRecyclerViewAdapter.ViewHolder>() {

    private val mNotes: ArrayList<Note> = notes

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = mNotes[position]
        holder.bind(item, onNoteSelectedListener)
    }

    override fun getItemCount(): Int = mNotes.size

    fun setItems(notes: ArrayList<Note>) {
        mNotes.clear()
        mNotes.addAll(notes)
        notifyDataSetChanged()
    }

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        private val idView: TextView = view.findViewById(R.id.item_number)
        private val contentView: TextView = view.findViewById(R.id.content)

        fun bind(item: Note, onNoteSelectedListener: MainActivityContract.OnNoteSelectedListener) {
            idView.text = item.id
            contentView.text = item.title
            itemView.setOnClickListener(View.OnClickListener { onNoteSelectedListener.onNoteSelected(item) })
        }

        override fun toString(): String {
            return super.toString() + " '" + contentView.text + "'"
        }
    }
}

как вы можете видеть выше, функция setItems () устанавливает очистку всех заметок в списке и их чтение, за которым следует notifyDataSetChanged ()

Представление, которое вызывает это, находится здесь:

class NotesListFragment() : BaseFragment(), MainActivityContract.OnNoteSelectedListener {

    var mAdapter: MyNoteRecyclerViewAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_notes_list_list, container, false)
        val lvNotes = view.findViewById<RecyclerView>(R.id.lv_notes);

        mAdapter = MyNoteRecyclerViewAdapter(ArrayList<Note>(), this)
        lvNotes.adapter = mAdapter

        return view
    }

    override fun onNoteSelected(note: Note) {
        (activity as MainActivity).onNoteSelected(Note());
    }

    fun onNotesLoaded(notes: ArrayList<Note>) {
        mAdapter?.setItems(notes)
        view?.findViewById<RecyclerView>(R.id.lv_notes)?.adapter?.notifyDataSetChanged()
    }

}

Функция onNotesLoaded вызывается внешним классом, который выбирает заметки. Как видите, я настраиваю элементы с помощью mAdapter.setItems (), который должен уведомить список об изменении данных, но безуспешно. Я попытался также добавить вторую строку, чтобы узнать, не хватает ли чего-то, чего мне не хватает, но опять же, не повезло.

Я не уверен, что это проблема kotlin с моей стороны при назначении переменной списка но любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Похоже, проблема заключалась в других областях моей кодовой базы, поэтому я закрою этот вопрос. Спасибо всем, кто пытался помочь

0 голосов
/ 03 августа 2020

Кажется, вы забыли добавить LayoutManager для RecyclerView

mAdapter = MyNoteRecyclerViewAdapter(ArrayList<Note>(), this)
lvNotes.adapter = mAdapter
lvNotes.layoutManager = LinearLayoutManager(context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...