1

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

事实上,我有一个字符串对应于我想要为我的 gridview 上的每个项目加载的标志性图像的 url 的项目。

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

例如,如果我用图像加载 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;
    }

谢谢大家!

祝你有美好的一天

4

2 回答 2

2

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

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

此方法将异步加载。

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

于 2014-07-14T08:09:34.147 回答