Как я могу реализовать раздел комментариев с помощью Recycler View - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь реализовать раздел комментариев, который позволяет пользователю публиковать и отвечать на другие комментарии.

У меня есть список комментариев, у каждого комментария есть список ответов, этот список может быть нулевым, если ответов нет.

Сначала я подумал об использовании двух представлений рециркулятора, затем увидел сообщение , в котором говорится, что использование 2 RecyclerViews - не лучший подход.

Комментарий и ответ имеют одинаковую компоновку, но у поля слева осталось 24dp.

Проблема

Моя проблема начинается с onBindViewHolder position будет go от 0 до комментариев + ответов

Например:

Список, содержащий 2 объекта с 5 ответами каждый, в onBindViewHolder

позиция = 3 будет reply[2] из comments[0] = comments[0].reply[2]

позиция = 6 будет comments[1]

Как определить комментарий индекс и индекс ответа с позиции? Я чувствую себя потерянным здесь

var comments = listOf<CommentModel>()
    set(value) {
        field = value
        notifyDataSetChanged()
    }

class ViewHolder(var binding: ItemForumCommentBinding) : RecyclerView.ViewHolder(binding.root) {
   fun bind(item: CommentModel){
       binding.commentModel = item
   }

   fun bind(item: ReplyModel){
       binding.commentModel = item
       (binding.commentGuideline.layoutParams as ConstraintLayout.LayoutParams).guideBegin = 24.px
   }
 }

 override fun onBindViewHolder(holder: ViewHolder, position: Int){
     //Bind comment or reply according to the position
     //holder.bind(comments[x].replys[y]) or holder.bind(comments[x])
 }

1 Ответ

1 голос
/ 28 марта 2020

Вы можете создать некоторый список, содержащий комментарии и ответы, и использовать его в качестве единого поставщика данных для списка, например:

var commentsWithReplies = mutableListOf<Any>()

var comments = listOf<CommentModel>()
    set(value) {
        field = value
        commentsWithReplies.clear()
        value.forEach {
            commentsWithReplies.add(it)
            commentsWithReplies.addAll(it.replies)
        }
        notifyDataSetChanged()
    }

Затем в getItemCount:

override fun getItemCount(): Int = commentsWithReplies.size

и onBindViewHolder:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
     val item = commentsWithReplies[position]
     if (item is CommentModel) {
       holder.bind(commentsWithReplies[position] as CommentModel)
     } else if (item is ReplyModel) {
       holder.bind(commentsWithReplies[position] as ReplyModel)
     }
}

PS

Конечно, это очень простое решение. Вы можете изменить его (по крайней мере, использовать пользовательский интерфейс, а не Any для общего списка c)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...