#android #observer #livedata
Активно изучаю LiveData в андроид и хотел бы разобраться со следующим вопросом. Андроид устройство - клиент, через сокет цепляется к серверу. Сервер периодически присылает какие-то сообщения, среди них есть события, которые необходимо отрисовывать на вьюшке. Я использую mvvm паттерн. На события, пришедшие от сокета, подписывается репозиторий: class EventRepository : IEventRepositoty { private companion object { val MAX_EVENT = 20 } private val mEventList = MutableLiveData>() val eventList : LiveData > = mEventList ..... } В репозитории хранится mEventList, в который я складываю события, пришедшие от сервера. Вопрос в том, что если ViewModel подпишется на eventList, то при записи нового события во ViewModel сработает observer, аргументом которого будет весь новый список. Но на вьюшке уже большая часть списка отрисована, и мне надо только вставить новый item. Решение, которое пришло в голову: события записывать не в LiveData, а в обычный list , а в LiveData держать только один EventModel Но что-то мне не нравится данный вариант, ибо при старте я запрашиваю последние события с сервера, и их придет список. Есть вариант держать LiveData >, но писать туда только список новых элементов (если событие одно, то, соответственно, список размера 1). Может, есть какой-то более удобный способ получить только измененную часть списка?
Ответы
Ответ 1
Если речь идет о RecyclerView, рекомендую вам обратить внимание на новый адаптер ListAdapter из библиотеки поддержки v7. Он обязывает реализовать механизм DiffUtil, который позаботится о вычислении изменений между новыми данными и уже имеющимися в адаптере и автоматически произведет нужные манипуляции (добавит, удалит, изменит соответствующие айтемы). Таким образом вы отдаете адаптеру актуальный список целиком (а не в ручную отбираете новые элементы), он же позаботится о остальном. При этом работать будет все полностью автоматически - при изменении данных в репозитории они будут изменяться и в виджете без каких либо действий с вашей стороны. Пример
Комментариев нет:
Отправить комментарий