GridView无法展示从JSON获取的表情图片问题求助
问题排查与修复方案
嘿,我帮你找出了几个导致图片不显示的关键问题,咱们一步步来解决:
1. 核心问题:Adapter数据类型不匹配
你仔细看一下:
ImageAdapter2的构造函数接收的是ArrayList<String>类型的图片URL列表- 但你在
BottomSheetDialog_Smiles中传给Adapter的是ArrayList<EmojiModel>对象列表
这就导致Adapter里的emojieImages实际上装的是EmojiModel实例,而不是String类型的URL地址,Picasso自然无法加载正确的资源。
修复方式(二选一):
方式一:修改Adapter适配EmojiModel
把ImageAdapter2的代码改成接收EmojiModel列表,然后直接从模型中取URL:
public class ImageAdapter2 extends BaseAdapter { private Context context; private ArrayList<EmojiModel> emojieModels; // 修改成员变量类型 // 构造函数同步修改 public ImageAdapter2(Context context, ArrayList<EmojiModel> emojieModelsList) { this.context = context; this.emojieModels = emojieModelsList; } @Override public int getCount() { return emojieModels.size(); } @Override public Object getItem(int position) { return emojieModels.get(position); } // ... 其他方法保持不变,只修改getView中的加载逻辑 @Override public View getView(final int position, View convertView, ViewGroup parent) { // ... Holder复用逻辑后面再说,先改Picasso部分 Picasso.with(context) .load(emojieModels.get(position).getEmojiFile()) // 从模型中获取URL .fit() .centerInside() .into(holder.imageView); // ... } }
方式二:提前提取URL到String列表
在BottomSheetDialog_Smiles的循环里,把每个EmojiModel的URL单独存入一个ArrayList<String>,再传给原Adapter:
// 新增一个String类型的列表 ArrayList<String> emojiUrls = new ArrayList<>(); for (int i = 0; i < emojies.length(); i++) { // ... 原有的模型初始化代码 emojieModels.add(emojiModel); emojiUrls.add(emojiModel.getEmojiFile()); // 提取URL } // 传给Adapter的是这个String列表 ImageAdapter2 emojiAdapter = new ImageAdapter2(getApplicationContext(), emojiUrls); gridView2.setAdapter(emojiAdapter);
2. EmojiModel构造函数的无效赋值
你的EmojiModel构造函数里有个低级错误:
public EmojiModel(String urlFile) { this.id=id; // 这里的id是成员变量(默认0),等于没赋值 this.price=price; // 同样的问题 this.urlFile=urlFile; }
虽然你后面调用init()方法覆盖了这些值,暂时不影响图片显示,但还是建议修复,避免后续逻辑出错:
public EmojiModel(String urlFile) { this.urlFile=urlFile; // id和price可以留到init方法赋值,或者直接设默认值 this.id = 0; this.price = 0; }
3. getView方法的性能优化(非显示问题,但建议修复)
你当前的getView方法每次都新建Holder、重新inflate布局,会导致GridView滑动卡顿,正确的做法是复用convertView和Holder:
@Override public View getView(final int position, View convertView, ViewGroup parent) { Holder holder; if (convertView == null) { holder = new Holder(); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 不要用null作为父布局,传入parent更规范 convertView = inflater.inflate(R.layout.smiles_items_layout, parent, false); holder.imageView = (ImageView) convertView.findViewById(R.id.smile_image_view); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } // 加载图片的逻辑 Picasso.with(context) .load(emojieModels.get(position).getEmojiFile()) .fit() .centerInside() .into(holder.imageView); return convertView; }
另外,不要用getApplicationContext()获取LayoutInflater,直接用传入的context即可,避免上下文相关的问题。
4. 额外验证:确认URL有效性
建议在循环里打印一下emojiModel.getEmojiFile()的值,确认从服务器获取的URL是完整、正确的(比如没有多余的转义字符、空格,或者是否需要拼接域名)。
先优先修复第一个核心问题,应该就能正常显示图片了!
内容的提问来源于stack exchange,提问作者O.D
相关产品推荐
相关产品推荐

