You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绑定本地JSON数据到RecyclerView 解决Glide加载与页面传值问题

解决方案

一、修复Glide图片无法显示的问题

图片加载失败的核心原因是:JSON中存储的@drawable/xxx格式字符串Glide无法直接识别,Glide会把这类字符串当做普通文件路径/网络URL解析,自然找不到对应资源。
按以下步骤修改即可:

  • 你可以选择直接修改JSON文件里的avatar字段,去掉@drawable/前缀,只保留资源名(比如user1、user2),也可以加载的时候动态处理前缀,两种方式都可以。
  • 替换适配器中onBindViewHolder里的Glide加载逻辑,先根据资源名拿到对应drawable的资源ID,再传给Glide加载:
// 替换原有Glide加载代码
val context = holder.itemView.context
val resName = avatar[position].removePrefix("@drawable/")
val avatarResId = context.resources.getIdentifier(resName, "drawable", context.packageName)
Glide.with(context)
    .load(avatarResId) // 传入资源ID而非原始字符串
    .circleCrop()
    .into(holder.imageJs)

二、实现点击列表项传递数据到DetailsActivity

你已经给User类加了@Parcelize注解实现了Parcelable序列化,直接通过Intent传递整个User对象即可,不用零散传每个字段:

  1. 先优化你的数据结构:你现在把User的每个字段拆成单独的ArrayList维护,不仅代码冗余,还容易出现多列表长度不一致导致的数组越界崩溃。直接把解析到的字段封装成你定义好的User对象,维护一个ArrayList<User>列表即可,适配器构造函数直接传入这个User列表,替换掉现在传入的8个零散ArrayList。
    主活动里解析JSON的逻辑可以改成:
    val userList = arrayListOf<User>()
    // 循环解析userArray的时候
    for (i in 0 until userArray.length()) {
        val userDetail = userArray.getJSONObject(i)
        val user = User(
            name = userDetail.getString("name"),
            username = userDetail.getString("username"),
            company = userDetail.getString("company"),
            avatar = userDetail.getString("avatar"),
            location = userDetail.getString("location"),
            repository = userDetail.getInt("repository"),
            follower = userDetail.getInt("follower"),
            following = userDetail.getInt("following")
        )
        userList.add(user)
    }
    
  2. 在适配器的onBindViewHolder方法中给item添加点击事件,点击时跳转并传递数据:
    holder.itemView.setOnClickListener {
        val jumpIntent = Intent(context, DetailsActivity::class.java)
        jumpIntent.putExtra("key_user", userList[position])
        context.startActivity(jumpIntent)
    }
    
  3. 在DetailsActivity的onCreate方法中直接取出传递的对象即可使用所有字段:
    val currentUser = intent.getParcelableExtra<User>("key_user")
    // 之后直接用currentUser.name、currentUser.avatar等给详情页控件赋值即可
    

额外优化建议

  • Glide加载时尽量使用holder.itemView.context作为上下文,不要传入外部持有的Activity上下文,避免页面销毁时引发内存泄漏。
  • 后续可以引入Gson等JSON序列化库,不用手动逐个字段解析JSON,减少字段名写错的概率。
  • 适配器构造函数里的列表不要用ArrayList类型声明,用List即可,兼容性更好。

内容的提问来源于stack exchange,提问作者tankian vei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:33:30