Скорее всего мерцает из-за того, что лист пересоздается т.к. в этом случает уведомление об удаление об обновлении летит сразц. Копируй из полученного листа данные в старый и уже потом уведомляй об обновлении dataset как я прислал выше.
Или просто юзать ListAdapter, который вынесет всю ненужную логику в отдельный поток и сам посчитает (на основе DiffUtil.ItemCallback что нужно перерисовать, а что нет, а если ещё и Payload юзать, то можно добиться, что бы айтем перерисовывался не весь, а только то, что изменилось).
!Важно! В submitList
нужно передавать каждый раз новый список, если будет одна и та же ссылка DiffUtil не отработает!