Home > Back-end >  holder.bindingAdapterPosition returns -1
holder.bindingAdapterPosition returns -1

Time:07-07

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
            }
        }

CodePudding user response:

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

  • Related