Search code examples
kotlinandroid-recyclerviewpicassoandroid-viewholder

Cannot post Picasso image into recyclerview viewholder in Kotlin


I am currently working on a project in Kotlin and I'm having trouble working an image into a ViewHolder through Picasso and keep getting requests to create an extension function instead when troubleshoot. This is where the problem comes in

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val user = mUser[position]
        holder.userNameTextView.text = user.getUsername()
        holder.userFullNameTextView.text = user.getFullName()
        Picasso.get().load(user.getImage())
            .placeholder(R.drawable.ic_user_avatar_light)
            .into(holder.userProfileImageView)

... with the rest of my adapter being this

class SearchAdapter(private var mContext: Context,
                    private var mUser: List<User>,
                    private var isFragment: Boolean = false) : RecyclerView.Adapter<SearchAdapter.ViewHolder>() {

    private var firebaseUser: FirebaseUser? = FirebaseAuth.getInstance().currentUser

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(mContext).inflate(R.layout.user_item_layout, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val user = mUser[position]
        holder.userNameTextView.text = user.getUsername()
        holder.userFullNameTextView.text = user.getFullName()
        Picasso.get().load(user.getImage())
            .placeholder(R.drawable.ic_user_avatar_light)
            .into(holder.userProfileImageView)

        user.getUid()?.let { checkWatchingStatus(it, holder.userWatchButton as Button) }

        holder.itemView.setOnClickListener{
            val pref = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit()
            pref.putString("profileID", user.getUid())
            pref.apply()

            (mContext as FragmentActivity).supportFragmentManager.beginTransaction()
                .replace(R.id.viewPager, ProfileFragment()).commit()
        }

        holder.userWatchButton.setOnClickListener{
            if(holder.userWatchButton.text.toString() == "Watch"){
                firebaseUser?.uid.let{ itl ->
                    user.getUid()?.let { it1 ->
                        FirebaseDatabase.getInstance().reference
                            .child("Watch").child(itl.toString())
                            .child("Watching").child(it1)
                            .setValue(true).addOnCompleteListener{ task ->
                                if (task.isSuccessful){
                                    firebaseUser?.uid.let{ itl ->
                                        FirebaseDatabase.getInstance().reference
                                            .child("Watch").child(user.getUid()!!)
                                            .child("Watchers").child(itl.toString())
                                            .setValue(true).addOnCompleteListener{ task ->
                                                if (task.isSuccessful){

                                                }
                                            }
                                    }
                                }
                            }
                    }
                }
            } else  {
                firebaseUser?.uid.let{ itl ->
                    user.getUid()?.let { it1 ->
                        FirebaseDatabase.getInstance().reference
                            .child("Watch").child(itl.toString())
                            .child("Watching").child(it1)
                            .removeValue().addOnCompleteListener{ task ->
                                if (task.isSuccessful){
                                    firebaseUser?.uid.let{ itl ->
                                        FirebaseDatabase.getInstance().reference
                                            .child("Watch").child(user.getUid()!!)
                                            .child("Watchers").child(itl.toString())
                                            .removeValue().addOnCompleteListener{ task ->
                                                if (task.isSuccessful){

                                                }
                                            }
                                    }
                                }
                            }
                    }
                }
            }
        }
    }

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


    class ViewHolder(@NonNull itemView: View) :RecyclerView.ViewHolder(itemView) {
        var userNameTextView: TextView = itemView.findViewById(R.id.userName_search)
        var userFullNameTextView: TextView = itemView.findViewById(R.id.userFullName_search)
        var userProfileImageView: TextView = itemView.findViewById(R.id.userImage_search)
        var userWatchButton: TextView = itemView.findViewById(R.id.watchButton_search)


    }

    private fun checkWatchingStatus(uid: String, userWatchButton: Button){
        val watchingRef = firebaseUser?.uid.let{ itl ->
            FirebaseDatabase.getInstance().reference
                .child("Watch").child(itl.toString())
                .child("Watching")
        }

        watchingRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(p0: DataSnapshot) {
                if (p0.child(uid).exists()) {
                    userWatchButton.text = "Watching"
                } else {
                    userWatchButton.text = "Watch"
                }
            }

            override fun onCancelled(p0: DatabaseError) {

            }
        })
    }
}

Can anyone help?


Solution

  • In your ViewHolder, you're declaring userProfileImageView as a TextView not as an ImageView, and passing that into Picasso's into() method, which accepts an ImageView as a parameter, that is why it is asking to create an extension function.

    class ViewHolder(@NonNull itemView: View) :RecyclerView.ViewHolder(itemView) {
        var userNameTextView: TextView = itemView.findViewById(R.id.userName_search)
        var userFullNameTextView: TextView = itemView.findViewById(R.id.userFullName_search)
    
        //declare userProfileImageView as an ImageView
        var userProfileImageView: ImageView = itemView.findViewById(R.id.userImage_search)
        var userWatchButton: TextView = itemView.findViewById(R.id.watchButton_search)
    }