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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:20:52