从URL离子库加载图像时的适配器行为

时间:2014-06-26 07:34:11

标签: java android adapter ion

当我想使用离子库从适配器加载图像时,我遇到了问题。

事实上,我的项目的字符串对应于我想要为gridview上的每个项目加载的图标图像的网址。

问题是由于适配器视图管理(如果我没有错,重用现有视图),我不知道如何绕过这个......

例如,如果我使用图像加载10个元素,则第一次使用它。然后,当我滚动到底部,然后滚动到顶部时,图像会发生变化(由于重用现有视图...)

你能帮助我吗?

这是我的适配器代码:

public class ProtocoleAdapter extends BaseAdapter {
    private Context context;
    private List<ProtocoleItem> mListe;

    public ProtocoleAdapter(Context context, List<ProtocoleItem> liste) {
        this.context = context;
        this.mListe = liste;
    }

    private class ViewHolder {
        TextView txtTitre;
        ImageView img;

    }

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

        ViewHolder holder = null;

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater
                    .inflate(R.layout.grid_item, null);

            holder = new ViewHolder();

            holder.txtTitre = (TextView) convertView
                    .findViewById(R.id.grid_item_label);

            holder.img = (ImageView) convertView
                    .findViewById(R.id.grid_item_image);


            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final ProtocoleItem rowItem = mListe.get(position);


        boolean isLoaded = false;
        try {
            Bitmap bitmap = Ion.with(context)
                    .load(rowItem.getImage())
                    .asBitmap()
                    .get();

            isLoaded = true;

            holder.img.setImageBitmap(bitmap);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        if (!isLoaded) {
            if (position % 5 == 0) {
                holder.img.setBackgroundColor(0xff176799);
            } else {
                if (position % 4 == 0) {
                    holder.img.setBackgroundColor(0xff2F87B0);
                } else {
                    if (position % 3 == 0) {
                        holder.img.setBackgroundColor(0xff42A4BB);
                    } else {
                        if (position % 2 == 0) {
                            holder.img.setBackgroundColor(0xff5BC0C4);
                        } else {
                            holder.img.setBackgroundColor(0xff78D6C7);
                        }
                    }
                }
            }
        }

        holder.txtTitre.setText(rowItem.getTitre());


        return convertView;
    }

谢谢大家!

度过美好的一天

2 个答案:

答案 0 :(得分:2)

获取最新版本的Ion并使用以下内容。

Ion.with(holder.img)
.load(rowItem.getImage());

此方法将异步加载。

您当前的使用是阻止UI线程。 Ion应该正确处理convertView回收,所以这不是问题。

答案 1 :(得分:-1)