Я попытался найти несколько примеров решений в Интернете.Должно быть, но не смог найти.Я считаю, что многие из них слишком короткие или слишком подробные.Поэтому я добавлю сюда именно то, что вам нужно.Существует стандартизированный шаблон, включающий 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, как предложено в комментарии.
- Связывание Библиотека для уменьшения количества котельных плит