Как обновить данные объекта RecyclerView, который находится внутри составной функции?

#android #kotlin #android-jetpack-compose

Вопрос:

У меня есть RecyclerView файл, который создается и добавляется в мой макет компоновки с помощью AndroidView функции.

 @Composable
fun MyView(data: State<List<Item>>) {
   ...
   AndroidView(factory = { context ->
        RecyclerView(context).apply {
            layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
            layoutManager = LinearLayoutManager(context)
            adapter = ItemListAdapter().also { it.submitList(data.value) }
        }
    })
}
 

Я использовал RecyclerView вместо LazyColumn , потому что я хочу добавлять и удалять анимации, которые еще не поддерживаются LazyColumn , и я достигаю этого с помощью RecyclerView с помощью DiffUtil

Теперь, каждый раз, когда я data изменяю, представление перекомпозируется, таким образом, RecyclerView создается заново, а анимация не отображается.

Каков наилучший способ, которым я могу этого достичь? Должен ли я просто передать живые данные, а затем просмотреть их в адаптере RecyclerView?

Спасибо

Ответ №1:

Используйте update обратный вызов, он вызывается при каждой перекомпозиции:

 AndroidView(
    factory = { context ->
        RecyclerView(context).apply {
            layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
            layoutManager = LinearLayoutManager(context)
            adapter = ItemListAdapter().also { it.submitList().value }
        }
    },
    update = { recyclerView ->

    }
)
 

Не знаю, почему вы говорите, что «RecyclerView воссоздается» при каждой повторной композиции, это не должно быть так. Я протестировал, и update = { меня вызывают только при перекомпозиции