holder.bindingadapterposition返回-1

发布于 2025-02-13 05:51:12 字数 4581 浏览 0 评论 0原文

绑定适配器位置是返回-1,我不知道为什么,有人对我可能做错了什么有一个想法?

持有人。

适配器和视图持有人

class CommentAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private var likeClick: LikeClick? = null
    private var disLikeClick: DisLikeClick? = null

    inner class CommentHolder(view: View) : RecyclerView.ViewHolder(view) {
        val nicknameTextView: TextView = itemView.findViewById(R.id.nickname_text_view)
        val commentTextView: TextView = itemView.findViewById(R.id.comment_text_view)
        val likeCount: TextView = itemView.findViewById(R.id.like_count_text_view)
        val disLikeCount: TextView = itemView.findViewById(R.id.dislike_count_text_view)
        val likeBtn: ImageButton = itemView.findViewById(R.id.like_image_btn)
        val disLikeBtn: ImageButton = itemView.findViewById(R.id.disLike_Image_btn)

    }


    fun setLikeClickListener(clickListener: LikeClick) {
        likeClick = clickListener
    }
    fun setDisLikeClickListener(clickListener: DisLikeClick) {
        disLikeClick = clickListener
    }

    private val diffCallback = object : DiffUtil.ItemCallback<Comment>() {
        override fun areItemsTheSame(oldItem: Comment, newItem: Comment): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: Comment, newItem: Comment): Boolean {
            return oldItem.id == newItem.id
        }


    }

    private val diff = AsyncListDiffer(this, diffCallback)


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item_comment, parent, false)


        val holder: RecyclerView.ViewHolder = CommentHolder(view)

        //set on click listener for like and dislike
        Log.d("TESTLOG",diff.currentList.toString())
        //TODO FIX
        val commentItem = diff.currentList[holder.bindingAdapterPosition]
        val likeBtn=view.findViewById<ImageButton>(R.id.like_image_btn)
        val dislikeBtn=view.findViewById<ImageButton>(R.id.disLike_Image_btn)

        likeBtn.setOnClickListener {
            likeClick?.onLikeClick(commentItem.id,likeBtn)
        }

        dislikeBtn.setOnClickListener {
            disLikeClick?.onDisLikeClick(commentItem.id,dislikeBtn)
        }

        return holder
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

        val commentItem = diff.currentList[position]
                val videoHolder = holder as CommentHolder
                videoHolder.apply {
                    commentTextView.text = commentItem.comment
                    nicknameTextView.text = commentItem.nickname
                    likeCount.text = commentItem.commentlike.toString()
                    disLikeCount.text = commentItem.dislike.toString()


                    //check if user already liked/disliked this comment and change icon based on that
                    Utils.likes.forEach {
                        if(it == commentItem.id){
                            likeBtn.isSelected=true
                        }
                    }

                    Utils.disLikes.forEach {
                        if(it==commentItem.id){
                            disLikeBtn.isSelected=true
                        }
                    }

                }
    }

    override fun getItemCount(): Int {
        return diff.currentList.size
    }

    fun submitList(list: List<Comment>) {
        diff.submitList(list)
    }

    interface LikeClick {
        fun onLikeClick(commentId: Int, likeBtn:ImageButton)
    }
    interface DisLikeClick {
        fun onDisLikeClick(commentId: Int, disLikeBtn:ImageButton)
    }
}

oncreateviewholder中的log.d

显示了diff.currentlist包含的内容。

D/TESTLOG: [Comment(comment=firstcomment
    , commentlike=0, createdAt=2022-07-06T04:35:43.000Z, dislike=0, id=4, nickname=Alpac, videoId=170c3d0c-331f-4da9-974b-39703940f819)]

在哪里设置适配器

我向适配器提交评论列表,设置和不喜欢听众,然后将适配器应用于RecyClerview

ChikiCommentsFetcher().fetchCommentsOfAVideo(videoId).observe(viewLifecycleOwner){
            commentsRecyclerView.apply {
                commentAdapter.submitList(it)
                commentAdapter.setLikeClickListener(this@CommentsFragment)
                commentAdapter.setDisLikeClickListener(this@CommentsFragment)
                adapter=commentAdapter
            }
        }

binding adapter position is returning -1 and i cannot figure out why, anyone has an idea of what i could be doing wrong ?

holder.bindingAdapterPosition in onCreateViewHolder.

Adapter and viewHolder

class CommentAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private var likeClick: LikeClick? = null
    private var disLikeClick: DisLikeClick? = null

    inner class CommentHolder(view: View) : RecyclerView.ViewHolder(view) {
        val nicknameTextView: TextView = itemView.findViewById(R.id.nickname_text_view)
        val commentTextView: TextView = itemView.findViewById(R.id.comment_text_view)
        val likeCount: TextView = itemView.findViewById(R.id.like_count_text_view)
        val disLikeCount: TextView = itemView.findViewById(R.id.dislike_count_text_view)
        val likeBtn: ImageButton = itemView.findViewById(R.id.like_image_btn)
        val disLikeBtn: ImageButton = itemView.findViewById(R.id.disLike_Image_btn)

    }


    fun setLikeClickListener(clickListener: LikeClick) {
        likeClick = clickListener
    }
    fun setDisLikeClickListener(clickListener: DisLikeClick) {
        disLikeClick = clickListener
    }

    private val diffCallback = object : DiffUtil.ItemCallback<Comment>() {
        override fun areItemsTheSame(oldItem: Comment, newItem: Comment): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: Comment, newItem: Comment): Boolean {
            return oldItem.id == newItem.id
        }


    }

    private val diff = AsyncListDiffer(this, diffCallback)


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item_comment, parent, false)


        val holder: RecyclerView.ViewHolder = CommentHolder(view)

        //set on click listener for like and dislike
        Log.d("TESTLOG",diff.currentList.toString())
        //TODO FIX
        val commentItem = diff.currentList[holder.bindingAdapterPosition]
        val likeBtn=view.findViewById<ImageButton>(R.id.like_image_btn)
        val dislikeBtn=view.findViewById<ImageButton>(R.id.disLike_Image_btn)

        likeBtn.setOnClickListener {
            likeClick?.onLikeClick(commentItem.id,likeBtn)
        }

        dislikeBtn.setOnClickListener {
            disLikeClick?.onDisLikeClick(commentItem.id,dislikeBtn)
        }

        return holder
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

        val commentItem = diff.currentList[position]
                val videoHolder = holder as CommentHolder
                videoHolder.apply {
                    commentTextView.text = commentItem.comment
                    nicknameTextView.text = commentItem.nickname
                    likeCount.text = commentItem.commentlike.toString()
                    disLikeCount.text = commentItem.dislike.toString()


                    //check if user already liked/disliked this comment and change icon based on that
                    Utils.likes.forEach {
                        if(it == commentItem.id){
                            likeBtn.isSelected=true
                        }
                    }

                    Utils.disLikes.forEach {
                        if(it==commentItem.id){
                            disLikeBtn.isSelected=true
                        }
                    }

                }
    }

    override fun getItemCount(): Int {
        return diff.currentList.size
    }

    fun submitList(list: List<Comment>) {
        diff.submitList(list)
    }

    interface LikeClick {
        fun onLikeClick(commentId: Int, likeBtn:ImageButton)
    }
    interface DisLikeClick {
        fun onDisLikeClick(commentId: Int, disLikeBtn:ImageButton)
    }
}

Log.d in oncreateViewHolder

Shows what diff.currentlist contains.

D/TESTLOG: [Comment(comment=firstcomment
    , commentlike=0, createdAt=2022-07-06T04:35:43.000Z, dislike=0, id=4, nickname=Alpac, videoId=170c3d0c-331f-4da9-974b-39703940f819)]

Where i set the adapter

i submit a list of comments to adapter, set like and dislike listeners then apply adapter to recyclerView

ChikiCommentsFetcher().fetchCommentsOfAVideo(videoId).observe(viewLifecycleOwner){
            commentsRecyclerView.apply {
                commentAdapter.submitList(it)
                commentAdapter.setLikeClickListener(this@CommentsFragment)
                commentAdapter.setDisLikeClickListener(this@CommentsFragment)
                adapter=commentAdapter
            }
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

呆萌少年 2025-02-20 05:51:12

持有人位置应在OnBindViewHolder方法内处理。
另外,将单击移至OnBindViewHolder方法。

holder.likeBtn.setOnClickListener {
        likeClick?.onLikeClick(commentItem.id,likeBtn)
    }

    holder.dislikeBtn.setOnClickListener {
        disLikeClick?.onDisLikeClick(commentItem.id,dislikeBtn)
    }

查看此 recyclerview 教程

Holder positions should be handled inside the onBindViewHolder method.
Also, move your clicks to the onBindViewHolder method.

holder.likeBtn.setOnClickListener {
        likeClick?.onLikeClick(commentItem.id,likeBtn)
    }

    holder.dislikeBtn.setOnClickListener {
        disLikeClick?.onDisLikeClick(commentItem.id,dislikeBtn)
    }

check out this RecyclerView Tutorial

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文