#android #android-recyclerview
#Android #android-recyclerview
Вопрос:
У меня есть RecyclerView, в котором перечислены статьи, в каждой статье / элементе onBindViewHolder
я загружаю другой RecyclerView для комментариев, и мне нужно обновить их, когда пользователь вернется к действию.
Есть ли способ обнаружить активность OnResume
внутри onBindViewHolder
родительского RecyclerView?
Комментарии:
1. onResume — это метод жизненного цикла, onBindViewHolder связан с recyclerview, они на самом деле не совпадают 🙂 то, что вы хотите сделать, это обновить адаптер внутри onResume
2. @a_local_nobody но я не могу обновить дочерний адаптер recyclerview из onResume действия, потому что кажется невозможным отслеживать, какой текущий элемент родительского recyclerview просматривает пользователь в данный момент. Я думаю, для этого нет решений без большого обходного пути
Ответ №1:
Я предполагаю, что у вас есть некоторый класс данных для статьи, который содержит ее детали и комментарии. Вы передаете этот список первому переработчику, который в onBind заполняет переработчики комментариев данными. Если вам нужно обновить комментарии, просто передайте список статей с обновленными комментариями в адаптер статьи. Это вызовет onBindViewHolder
, внутри которого у вас появятся новые комментарии. В коде это было бы что-то вроде этого:
data class Article (
val name: String
... other details
val comments: List<Comment>
)
onBindViewHolder для адаптера статьи:
override fun onBindViewHolder(holder: Holder, position: Int) {
val article = getItem(position)
// here you should submit list of comments
commentsAdapter.submitList(article.comments)
}
и в Activity:
override fun onResume() {
super.onResume()
//get new comments here and set it for new articles
val newArticles = oldArticles.map { article -> it.copy(comments = newComments)}
articlesAdapter.submitList(newArticles)
}
Кстати, похоже, что AdapterDelegates было бы еще лучшим решением вашей проблемы. Подробнее читайте здесь: http://hannesdorfmann.com/android/adapter-delegates
Комментарии:
1. Вы имеете в виду обновление статей в родительском recyclerview? Если да, то это не то, что мне нужно, таким образом, я бы снова запустил API для получения комментариев. Если это не так, но по-прежнему требует наличия всего нового списка комментариев, то у меня его нет ^^ У меня есть только обновленная информация для одного конкретного идентификатора комментария, который уже загружен и который мне нужно обновить
2. Я не вижу проблемы, вы должны удерживать состояние в viewmodel, и если обновляется только один комментарий, то вы обновляете только один в своем состоянии, т.е.:
val newComment = artciles.findOrNull { predicate }?.comments.findOrNull { it.id == idFetchedFromApi }?.copy( update it here as you need)
, а затем обновляете комментарии к статье таким же образом.3. Хорошо, я понял, поместив комментарии внутри списка статей, поэтому, когда onBindViewHolder снова загружается и появляется список комментариев, пропустите API