在Viewholder中从URL加载图片。

3

我想从URL加载图像到我的视图持有者,但不确定如何做到这一点。我尝试使用setImageUri和Picasso,但由于我有来自绑定函数的参数,我不知道应该在哪里传递它,因为我想传递URL,但似乎这种方式行不通。请问正确的做法是什么?

以下是代码:

class ViewHolder (private val binding: ItemDetailBinding
): RecyclerView.ViewHolder(binding.root) {
   fun bind(item:String){
       Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(binding.ivItem)
   }
}

2个回答

2
你可以在你的RecyclerView适配器的onBindViewHolder方法中完成这个操作:
override fun onBindViewHolder(holder: MyViewHolder,position: Int) {
    Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(holder.yourImageView)
}

似乎无法将ivItem传递到那里。 - dazai
你不必传递 ivItem,因为你可以通过 holder 访问到 ImageView - Amirhosein

1
你仍然可以从bind()函数传递的参数中传递url。还有一件事,你应该将Picasso替换为Glide。有很多关于为什么使用Glide而不是Picasso的信息。
例如,我有一个名为User的数据类,如下所示:
data class User (
    val name: String? = null,
    val avatarUri: String? = null
)

然后为您的User创建一个视图持有者。在视图持有者中,您有一个图像视图,该图像视图将从Picasso加载图像。

class MyViewHolder (
    private val binding: ItemDetailBinding
) : RecyclerView.ViewHolder(binding.root) {

    fun bind(item: User) {
        binding.executePendingBindings()
        Picasso.get().load(item.avatarUri).into(binding.ivItem)
    }
}

在ListAdapter中,具体来说是在onBindViewHolder()函数中,您调用视图持有者的绑定函数并将参数传递给它。
class MoviesAdapter : ListAdapter<User, MyViewHolder>(MyDiffUtil) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val inflate = ItemDetailBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return MyViewHolder(inflate)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
}

object MyDiffUtil : DiffUtil.ItemCallback<User>() {

    override fun areItemsTheSame(oldItem: User, newItem: User): Boolean =
        oldItem.name == newItem.name
    
    override fun areContentsTheSame(oldItem: User, newItem: User): Boolean =
        oldItem == newItem
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接