Как обновить представление Recycler живыми данными внутри фрагмента? - PullRequest
0 голосов
/ 10 июня 2019

Я хочу обновить мой Recycler View, чтобы при каждом удалении строки из таблицы в базе данных он обновлял Recycler View сразу, не обновляя фрагмент.

 override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View?
    {

        var binding:FragmentDisplayBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_display,container,false)

        var view:View = binding.root

        var new_task : FloatingActionButton = view.findViewById(R.id.add_newTask)





        var db = Room.databaseBuilder(context!!,tasksDb:: class.java,"mydb").allowMainThreadQueries().build()
        viewManager = LinearLayoutManager(context)

        recyclerView = view.findViewById(R.id.recyclerView)

        db.task().getAll().observe(this, Observer {
            this.myAdapter = myAdapter(it)
            recyclerView.adapter = myAdapter
            recyclerView.layoutManager = viewManager
        })

Я считаю, что я не должен использовать .observe () в методе onCreateView (). Какие изменения я должен внести в код ??

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Я попытался найти несколько примеров решений в Интернете.Должно быть, но не смог найти.Я считаю, что многие из них слишком короткие или слишком подробные.Поэтому я добавлю сюда именно то, что вам нужно.Существует стандартизированный шаблон, включающий RecyclerView + LiveData, поэтому просто следуйте этому шаблону для всех ваших RecyclerView + LiveData использования.

Фрагмент:

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {

    ...

    val recyclerView = view.findViewById(R.id.recyclerView)
    val myAdapter = MyAdapter()
    recyclerView.adapter = myAdapter
    // recyclerView.layoutManager = LinearLayoutManager(context) // You need this only if you haven't set it in xml

    db.task().getAll().observe(viewLifecycleOwner, Observer {
        myAdapter.submitList(it)
    })
}

Несколько важных изменений, внесенных здесь:

  • Вы должны .observe() в onCreateView().Не только для этого конкретного случая, но в целом вам никогда не понадобится звонить .observe() в любых других местах, если вы правильно используете LiveData.
  • viewLifecycleOwner является правильным LifecycleOwner для использования всоблюдая LiveData.(Если вы не создаете пользовательский.)
  • Зависит от варианта использования, но обычно создает один адаптер на RecyclerView, даже если ваши данные со временем меняются.Вы должны поменять местами данные, а не весь адаптер.


MyAdapter:

MyAdapter должен реализовать *Функция 1038 *, которая будет использоваться представлением

class MyAdapter: RecyclerView.Adapter<ViewHolder>() {

    val myData = mutableListOf<Data>()

    fun submitList(newData: List<Data>) {
        myData.clear()
        myData.addAll(newData)
        notifyDataSetChanged()
    }
}

Обратите внимание, что notifyDataSetChanged() - это сигнал, который фактически сигнализирует адаптеру обновить представление.


Улучшения:

Я думаю, что вышеупомянутое решение достаточно хорошо для вашей проблемы, учитывая, что ваш список не слишком большой или слишком часто обновляется.Если вы хотите еще больше улучшить производительность и / или удобочитаемость, изучите следующее:

  • Используйте библиотеку Paging для разбиения на страницы длинного или бесконечного списка.
  • Разница в работникеиспользуйте DiffUtil, как предложено в комментарии.
  • Связывание Библиотека для уменьшения количества котельных плит
0 голосов
/ 10 июня 2019

Может быть, это поможет.

Для обновления ваших предметов в утилизаторе вам необходимо использовать следующий код

myAdapter.notifyDataSetChanged ();recyclerview.setAdapter (myAdapter);

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

...