Android ListView getView随机显示图像

时间:2016-05-06 22:28:05

标签: java android listview imageview android-arrayadapter

我想在ListView中显示带有适配器的项目,但是当在ArrayAdapter中调用getView时,它会在滚动时显示良好的图像,但不会显示在好的项目上。就好像findViewById没有给我布局的好ID。

public class ItemPackAdapter extends ArrayAdapter<Pack> {
Context context;

public ItemPackAdapter(Context context, ArrayList<Pack> pack) {
    super(context, 0, pack);
    this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    // Check if an existing view is being reused, otherwise inflate the view
    final Pack pack = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false);
        holder = new ViewHolder();
        holder.textView1 = (TextView) convertView.findViewById(R.id.textView1);
        holder.textView2 = (TextView) convertView.findViewById(R.id.textView2);
        holder.textView3 = (TextView) convertView.findViewById(R.id.textView3);
        holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
        if (!pack.getImageName().equals("null")) {
            UrlGenerator urlGenerator = new UrlGenerator();
            String url = urlGenerator.getDownloadPicture(pack.getImageName());
            DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext());
            downloadPicture.start();
        }
        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder)convertView.getTag();
    }
    holder.textView1.setText(pack.getSomething1());
    holder.textView2.setText(pack.getSomething2());
    holder.textView3.setText(pack.getSomething3());
    if (!pack.getImageName().equals("null")) {
        UrlGenerator urlGenerator = new UrlGenerator();
        String url = urlGenerator.getDownloadPicture(pack.getImageName());
        DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext());
        downloadPicture.start();
    }
    if(pack.getImageName().equals("null")){
        holder.imageView.setImageBitmap(null);
    }
    return convertView;
}
static class ViewHolder {
    TextView textView1;
    TextView textView2;
    TextView textView3;
    ImageView imageView;
}
}

实际上我找到了一个解决方案:

if(pack.getImageName().equals("null")){
        holder.imageView.setImageBitmap(null);
    }

但是当我在listView上滚动时,我可以在错误的项目中看到图像,我需要再次滚动来调用getView以删除具有先前条件的图像。 我想要更干净的东西:p

提前谢谢你。 抱歉我的英语不好。

2 个答案:

答案 0 :(得分:1)

只需稍微调整一下,您的代码看起来就可以了。我发现你正在设置ImageView两次,所以我编辑你的代码如下所示

public class ItemPackAdapter extends ArrayAdapter<Pack> {
    Context context;
    ArrayList<Pack> packs;

    public ItemPackAdapter(Context context, ArrayList<Pack> packs) {
        super(context, 0, packs);
        this.context = context;
        this.packs = packs;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        // Check if an existing view is being reused, otherwise inflate the view
        final Pack pack = packs.get(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false);
            holder = new ViewHolder();
            holder.textView1 = (TextView) convertView.findViewById(R.id.textView1);
            holder.textView2 = (TextView) convertView.findViewById(R.id.textView2);
            holder.textView3 = (TextView) convertView.findViewById(R.id.textView3);
            holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        if (pack.getImageName().equals("null")) {
            holder.imageView.setImageBitmap(null);
        } else {
            UrlGenerator urlGenerator = new UrlGenerator();
            String url = urlGenerator.getDownloadPicture(pack.getImageName());
            DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext());
            downloadPicture.start();
        }
        holder.textView1.setText(pack.getSomething1());
        holder.textView2.setText(pack.getSomething2());
        holder.textView3.setText(pack.getSomething3());

        return convertView;
    }

    static class ViewHolder {
        TextView textView1;
        TextView textView2;
        TextView textView3;
        ImageView imageView;
    }
}

答案 1 :(得分:0)

在这种情况下,如果你没有缓存你的图像可能会让你像这样的问题。 强烈建议使用 Picasso 库来避免此问题。在项目中添加 picasso 库,然后将代码写成这样的东西。

Picasso.with(getApplicationContext()).load(url).into(holder.imageView);

而不是这一行

DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext());
downloadPicture.start();