You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android RecyclerView仅显示最后一条评论问题及完整列表获取问询

解决RecyclerView仅显示评论最后一个元素的问题

看起来你遇到的核心问题是数据源传递错误+Adapter绑定逻辑混乱,导致RecyclerView只能显示最后一条评论。咱们一步步拆解问题,然后给出修复方案:

问题根源分析

  1. 数据源类型错误:你的Adapter接收的是List<SuccessStoryModel>,但实际上你要展示的是单条SuccessStoryModel里的comments列表(也就是List<CommentModel>)。你的JSON数据里只有1个SuccessStoryModel对象,所以getItemCount()返回1,自然只会显示一个Item。
  2. 绑定逻辑错误:在onBindViewHolder里你循环了所有评论,每次循环都会覆盖Holder的文本内容,最后只会保留最后一次循环的结果(也就是最后一条评论)。而且索引使用完全混乱(successCommentModel[i].comments!![pos]这里的i和pos逻辑不匹配,还可能导致数组越界)。

修复步骤&代码

1. 补全Model类的属性

你的CommentModel里漏掉了commenttextusername的定义,这两个是展示评论必须的字段,先补上:

class SuccessStoryModel {
    @SerializedName("comments")
    @Expose
    var comments: List<CommentModel>? = null

    inner class CommentModel {
        @SerializedName("commentid")
        @Expose
        var commentid: String? = null
        
        @SerializedName("postid")
        @Expose
        var postid: String? = null
        
        @SerializedName("commenttext")
        @Expose
        var commenttext: String? = null // 新增
        
        @SerializedName("username")
        @Expose
        var username: String? = null // 新增
    }
}

2. 重写CommentAdapter,适配评论列表

把Adapter的数据源改成List<CommentModel>,直接绑定每条评论:

class CommentAdapter(
    private val context: Context, 
    private val commentList: List<SuccessStoryModel.CommentModel>,
    private val targetPostId: String // 要匹配的帖子ID
) : RecyclerView.Adapter<CommentAdapter.RecyclerViewAdapter>() {

    // 创建ViewHolder,和之前逻辑一致
    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerViewAdapter {
        val view = LayoutInflater.from(context).inflate(R.layout.custom_comment, viewGroup, false)
        return RecyclerViewAdapter(view)
    }

    // 绑定每条评论,不再循环!
    override fun onBindViewHolder(holder: RecyclerViewAdapter, pos: Int) {
        val currentComment = commentList[pos]
        
        // 只展示目标帖子的评论
        if (currentComment.postid == targetPostId) {
            holder.user_name.text = currentComment.username
            holder.user_comment.text = currentComment.commenttext
            
            // 显示控件
            holder.user_name.visibility = View.VISIBLE
            holder.user_comment.visibility = View.VISIBLE
            holder.no_user_comment.visibility = View.GONE
        } else {
            // 不匹配则隐藏
            holder.user_name.visibility = View.GONE
            holder.user_comment.visibility = View.GONE
            holder.no_user_comment.visibility = View.GONE
        }
    }

    // 返回评论的数量,而不是故事的数量
    override fun getItemCount(): Int {
        return commentList.size
    }

    // ViewHolder类,记得内部定义
    inner class RecyclerViewAdapter(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val user_name = itemView.findViewById<TextView>(R.id.user_name)
        val user_comment = itemView.findViewById<TextView>(R.id.user_comment)
        val no_user_comment = itemView.findViewById<TextView>(R.id.no_user_comment)
    }
}

3. 正确初始化Adapter

从解析后的SuccessStoryModel中取出评论列表,传给Adapter:

// 假设你已经通过Gson等工具解析得到了SuccessStoryModel实例(比如叫successStory)
val comments = successStory.comments ?: emptyList() // 为空时用空列表避免空指针
val commentAdapter = CommentAdapter(this, comments, "2") // "2"是你要展示的帖子ID,对应JSON里的postid
val recyclerView = findViewById<RecyclerView>(R.id.your_recyclerview_id)
recyclerView.adapter = commentAdapter
recyclerView.layoutManager = LinearLayoutManager(this) // 别忘了设置布局管理器

额外说明

  • 如果你需要处理回复评论(比如isreply为true的情况),可以在onBindViewHolder里根据currentComment.isreply调整UI(比如缩进显示)。
  • 建议使用ViewBinding来替代findViewById,减少模板代码和空指针风险。

内容的提问来源于stack exchange,提问作者Darshan Komu

火山引擎 最新活动