Kotlin实现RecyclerView Firebase图片传值新Activity ImageView展示
问题:RecyclerView点击跳转后新页面ImageView无法加载Firebase图片
实现目标
- 已完成Firebase Realtime Database存储图片在RecyclerView中的列表展示
- 需要实现交互:点击RecyclerView内图片时自动跳转至新Activity,同时将被点击图片传递到新页面的ImageView中展示
参考效果
现有代码
适配器类(AbstractAdapter)
class AbstractAdapter(private val mContext: Context, private val abstractList: ArrayList<Abstract>) : RecyclerView.Adapter<AbstractAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.abstract_image_view, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.imageView.setOnClickListener { val intent = Intent(mContext, PreviewActivity::class.java) intent.putExtra("abstract", abstractList[position].abstract.toString()) mContext.startActivity(intent) } holder.download_btn.setOnClickListener { } Glide.with(mContext) .load(abstractList[position].abstract) .into(holder.imageView) } override fun getItemCount(): Int { return abstractList.size } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val imageView: ImageView = itemView.findViewById(R.id.abstractImageView) val download_btn: Button = itemView.findViewById(R.id.abstractDownloadBtn) } companion object { private const val Tag = "RecyclerView" } }
预览页Activity(PreviewActivity)
class PreviewActivity : AppCompatActivity() { private lateinit var previewImage: ImageView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_preview) previewImage = findViewById(R.id.preview_image) val previewImage: ImageView = findViewById(R.id.preview_image) val bundle :Bundle? = intent.extras val preview = bundle!!.getString("abstract") } }
数据模型类(Abstract)
class Abstract(var abstract: String? = null) { }
问题现象
运行代码后Logcat无报错,页面可正常跳转,但新Activity的ImageView始终无法显示目标图片。
问题根因
代码存在3个问题导致图片无法显示:
- 核心问题:预览页仅获取了传递过来的图片URL字符串,没有调用Glide将URL对应的图片渲染到ImageView上
- PreviewActivity中重复定义同名
previewImage变量,类成员变量和方法内局部变量重名,存在作用域冲突 - 适配器传值时直接对可空类型的
abstract字段调用toString(),如果字段为null会传递字符串"null",导致Glide加载无效地址
修复方案
1. 修正适配器点击传值逻辑,增加空安全判断
修改onBindViewHolder中的点击事件代码:
holder.imageView.setOnClickListener { // 字段为空时直接拦截点击,不执行跳转 val imageUrl = abstractList[position].abstract ?: return@setOnClickListener val intent = Intent(mContext, PreviewActivity::class.java) intent.putExtra("abstract", imageUrl) mContext.startActivity(intent) }
2. 修复PreviewActivity代码,增加图片加载逻辑
class PreviewActivity : AppCompatActivity() { // 仅定义一次控件变量,删除重复定义 private lateinit var previewImage: ImageView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_preview) previewImage = findViewById(R.id.preview_image) // 读取传递的图片URL,做非空校验 val imageUrl = intent.getStringExtra("abstract") if (!imageUrl.isNullOrEmpty()) { // 和列表页逻辑一致,用Glide加载图片到ImageView Glide.with(this) .load(imageUrl) .into(previewImage) } } }
额外校验:确认预览页布局
activity_preview.xml内的ImageView id确实为preview_image,避免控件id不匹配导致加载失效。
内容的提问来源于stack exchange,提问作者Khumo Mashapa
相关产品推荐
相关产品推荐

