如何将ArrayList中所有图片填充到RecyclerView的ImageView?解决仅显示首图问题
问题分析与解决方案
核心问题
你的代码里每个RecyclerView Item只有单个ImageView,但你在onBindViewHolder中遍历当前AgriBusinessModel的images数组,反复将不同图片加载到同一个ImageView上。由于ImageView一次只能显示一张图,最终只会保留最后一次加载的图片(你说显示第一张,大概率是异步加载顺序问题:第一张图先加载完成,后续图片加载时出现异常或者被覆盖前用户已经看到了第一张)。
另外,代码里有个语法错误:forEachIndexed的lambda表达式箭头写错了,应该是->而不是-,虽然日志能打印,但可能导致逻辑执行异常:
// 错误写法 agriModel.images?.forEachIndexed { index, uri - // 正确写法 agriModel.images?.forEachIndexed { index, uri ->
解决方案
根据你的需求分两种情况处理:
情况1:每个Item只显示对应模型的第一张图片
直接取images列表的第一个元素加载,去掉遍历逻辑:
override fun onBindViewHolder(holder: ViewHolder, position: Int) { val agriModel: AgriBusinessModel = agriArrayList[position] holder.nameV.text = agriModel.name // 只加载第一张图片 agriModel.images?.firstOrNull()?.let { firstUri -> Picasso.get().load(firstUri).into(holder.images) } }
情况2:每个Item需要显示对应模型的所有图片
这时候单个ImageView无法满足,需要修改Item布局,换成可以承载多个图片的容器,比如横向RecyclerView:
- 先修改
item_agri.xml,添加横向RecyclerView:
<!-- 原布局保留nameV,新增横向RecyclerView --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/imagesRecyclerView" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"/>
- 新建一个图片列表的Adapter(比如
AgriImageAdapter):
class AgriImageAdapter(private val imageUris: List<String>) : RecyclerView.Adapter<AgriImageAdapter.ImageViewHolder>() { inner class ImageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val imageView: ImageView = itemView.findViewById(R.id.singleImage) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_single_image, parent, false) return ImageViewHolder(view) } override fun onBindViewHolder(holder: ImageViewHolder, position: Int) { Picasso.get().load(imageUris[position]).into(holder.imageView) } override fun getItemCount() = imageUris.size }
- 修改原Adapter的
ViewHolder和onBindViewHolder:
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val nameV: TextView = itemView.findViewById(R.id.name) val imagesRecyclerView: RecyclerView = itemView.findViewById(R.id.imagesRecyclerView) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val agriModel: AgriBusinessModel = agriArrayList[position] holder.nameV.text = agriModel.name // 配置横向RecyclerView agriModel.images?.let { uris -> val layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) holder.imagesRecyclerView.layoutManager = layoutManager holder.imagesRecyclerView.adapter = AgriImageAdapter(uris) } }
内容的提问来源于stack exchange,提问作者Thabit Simbweje
相关产品推荐
相关产品推荐

