Android — onResume внутри onBindViewHolder в Recyclerview

#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