Android Studio ListView从JSON加载成员列表时成员图片无法显示求助
图片空白问题排查与修复
根因定位
- 写入JSON的
@drawable/xxx是XML布局专属的资源引用语法,无法被Java层的SimpleAdapter直接识别。SimpleAdapter默认绑定ImageView的逻辑仅支持两种输入:int类型的Drawable资源ID、可解析的图片Uri路径。传入的字符串会被当成无效Uri解析,最终加载为空图 - 原数据结构使用
HashMap<String, String>存储内容,Drawable资源ID为int类型,类型不匹配导致图片绑定链路中断
修复实现
- 调整数据集合泛型,兼容int类型的资源存储:
将原有ArrayList<HashMap<String, String>> listItems = new ArrayList<>();修改为ArrayList<HashMap<String, Object>> listItems = new ArrayList<>(); - 解析JSON时,将字符串形式的资源引用转换为实际的int资源ID,替换原有直接存字符串的逻辑:
String memberimageStr = obj.getString("memberimage"); // 剥离@drawable/前缀,提取图片文件名 String imageName = memberimageStr.replace("@drawable/", ""); // 通过资源系统匹配对应的drawable资源ID int imageResId = getResources().getIdentifier(imageName, "drawable", getPackageName()); // 将int类型的资源ID存入Map,而非原字符串 listItem.put("memberimage", imageResId);
- 给SimpleAdapter设置自定义ViewBinder,手动处理ImageView的绑定逻辑:
SimpleAdapter adapter = new SimpleAdapter(this, listItems, R.layout.main_list_item_layout, new String[]{"serialno","memberimage","membername","farmacyname","mobileno","address"}, new int[]{R.id.serialTextViewId,R.id.imageViewId,R.id.nameTextViewId, R.id.shopNameTextViewId,R.id.mobileNoTextViewId,R.id.addressTextViewId}); // 新增绑定逻辑 adapter.setViewBinder(new SimpleAdapter.ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // 匹配图片控件和int类型的资源数据 if (view instanceof ImageView && data instanceof Integer) { ((ImageView) view).setImageResource((Integer) data); return true; // 标记手动完成绑定,跳过默认逻辑 } // 文本类控件沿用默认绑定逻辑,无需修改 return false; } }); listview.setAdapter(adapter);
校验注意事项
- 必须确认 res/drawable目录下存在名为
tojib的图片文件,文件名需符合Android资源命名规范(仅小写字母、数字、下划线,无大写字符或特殊符号),否则getIdentifier会返回0,导致图片加载失败 - 原有JSON结构无需调整,上述逻辑可兼容现有
@drawable/xxx格式的字段值
内容的提问来源于stack exchange,提问作者Tojibul Islam
相关产品推荐
相关产品推荐

