【问题标题】:How to load images into GridView within ListView?如何将图像加载到 ListView 中的 GridView 中?
【发布时间】:2016-11-15 16:35:53
【问题描述】:

在 ListView 适配器中:

    public View getView(int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        final DataEntity data = dataList.get(position);

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.item_list_asset_receivable, null);
            holder.amountTV = (TextView) convertView.findViewById(R.id.tv_asset_liability_fill_accounts_receivable_amount);
            holder.gridView = (CustomGridView) convertView.findViewById(R.id.cgv_images);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.amountTV.setText(String.valueOf(data.getAmount()));

        final String id = data.getPicGroupId();

        OkHttpUtilsHelper.getImagesByGroupId(data.getPicGroupId(), TAG)
                .execute(new ImageGroup.MyCallback() {
                    @Override
                    public void onResult(List<String> images) {
                        CustomGridViewAdapter adapter = new CustomGridViewAdapter(context, images);
                        holder.gridView.setAdapter(adapter);
                    }
                });

        return convertView;
    }
}

在 GridView 适配器中,我使用 glide 将互联网图像加载到 ImageView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) {
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.item_gridview_pics, null);
        viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_pic);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    String imgPath = (String) dataList.get(position);
    if (imgPath.startsWith("http")) {
        Glide.with(context)
                    .load(imgPath)
                    .centerCrop()
                    .placeholder(R.mipmap.ic_launcher)
                    .crossFade()
                    .into(viewHolder.imageView);
    } else {
        viewHolder.imageView.setImageBitmap(BitmapFactory.decodeFile(imgPath));
    }

    return convertView;
}

我已经解决了 ListView 与 GridView 的问题,例如:Add a GridView to a ListView in Android

虽然根据日志,似乎gridview适配器的getView()会向后触发listview适配器的getView(),然后再次调用gridview适配器的getview,一个deed循环!

欢迎提出任何建议!

【问题讨论】:

  • 参考this
  • 谢谢,但是我已经用过glide了,这不是如何异步加载图片的问题,我们应该关注如何在listview中正确使用gridview。

标签: android listview gridview


【解决方案1】:

您可以使用Picasso Library

示例代码:

Picasso.with(mContext) //
            .load(TextUtils.isEmpty(mList.get(position).getImage_url()) ? null : mList.get(position).getImage_url())
            //.load("https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRp81DX-2x8DAJCmMCQKdYX3Hs1F-OGqhX_eYQnkbxtaX1dMrMNo8QMCY0")
            .tag(mContext) //
            .into(holder.imageViewDocumentIcon);

【讨论】:

    【解决方案2】:

    您可以使用以下库,

    1. Picasso

    2. Android-Universal-Image-Loader

    3. Fresco

    4. Glide

    这可能对你有帮助。

    【讨论】:

      【解决方案3】:

      更好地使用Aquery

      aq.id(R.id.simpleLoadImg).image("http://programmerguru.com/android-tutorial/wp-content/uploads/2014/01/asynctask_thumb.png",false,false);
      

      【讨论】:

        【解决方案4】:

        这个问题并不是要解决如何异步加载图像,关键是当listview内部视图--gridview从互联网加载图像时,视图发生变化,listview会再次调用getView()方法将是一个死循环。

        我发现你不能在getView()方法中做异步工作,这个方法不能加载回调结果或者结果会再次触发getView()。

        所以,我将这个异步作业移到了 getView() 之外:

          OkHttpUtilsHelper.getImagesByGroupId(data.getPicGroupId(), TAG)
                    .execute(new ImageGroup.MyCallback() { 
                        @Override 
                        public void onResult(List<String> images) {
                            CustomGridViewAdapter adapter = new CustomGridViewAdapter(context, images);
                            holder.gridView.setAdapter(adapter);
                        } 
                    }); 
        

        刚刚得到结果,传给listview适配器,问题就解决了!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-31
          • 2017-07-13
          相关资源
          最近更新 更多