如何绑定本地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对象即可,不用零散传每个字段:
- 先优化你的数据结构:你现在把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) } - 在适配器的onBindViewHolder方法中给item添加点击事件,点击时跳转并传递数据:
holder.itemView.setOnClickListener { val jumpIntent = Intent(context, DetailsActivity::class.java) jumpIntent.putExtra("key_user", userList[position]) context.startActivity(jumpIntent) } - 在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
相关产品推荐
相关产品推荐

