滚动我的列表视图项目图像已更改

时间:2015-08-30 10:11:31

标签: android android-listview imageview

public class Adapter extends BaseAdapter {
    private static ArrayList<ItemDetails> aList;

    private LayoutInflater l_Inflater;


    public Adapter(Context context, ArrayList<ItemDetails> results) {
        aList = results;
        l_Inflater = LayoutInflater.from(context);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = l_Inflater.inflate(R.layout.mylist1, null);
            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.title = (TextView) convertView.findViewById(R.id.txt1);
            holder.ago = (TextView) convertView.findViewById(R.id.date);

            holder.member = (TextView) convertView.findViewById(R.id.member);
            holder.itemImage = (ImageView) convertView.findViewById(R.id.img_t);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.name.setText(aList.get(position).getName());
        holder.title.setText(aList.get(position).getTitle());
        holder.ago.setText(aList.get(position).getAgo());
        holder.member.setText(aList.get(position).getMember());
        String url = aList.get(position).getImg();
        Log.d("image_name", url);
        if (url.length() > 9) {
            Log.d("image_url", url);
            DownloadFileFromURL img = new DownloadFileFromURL(holder.itemImage, position);
            img.execute(url);
            if(img.pos == position) {
                holder.itemImage.setImageBitmap(img.bitmap);
            }
            aList.get(position).setChanged();
        }
        notifyDataSetChanged();
        return convertView;
    }

    public static class ViewHolder {
        TextView name;
        TextView title;
        TextView ago;
        TextView member;
        ImageView itemImage;
    }
}

asynck任务类成功后我改变了图像

    protected void onPostExecute(String file_url) {
                if (imageViewReference != null) {
                    ImageView imageView = imageViewReference.get();
                            imageView.setImageBitmap(bitmap);
                   }
            }

        }

2 个答案:

答案 0 :(得分:1)

尽量不要将viewview放在viewholder中。喜欢这个

ImageView itemImage = (ImageView) convertView.findViewById(R.id.img_t);
itemImage.setImageBitmap(img.bitmap);

如果这不能解决问题,请使用毕加索或滑动下载,缓存和显示图像。

答案 1 :(得分:1)

ViewHolder模式用于循环创建的视图(用于优化并防止充斥大量View),当您滚动列表视图时,实际上您有请求下载几个不同的图像URL并在同一ImageView中显示它们(原因) holder.itemImage refrence未更改)。 因此,只要您的AsyntTask完成其工作,您的图像视图就会发生变化。

解决方案:您可以为每一行的视图充气,不要使用ViewHolder模式(不推荐),或者签署您的图片视图(使用holder.itemImage.setTag(&#34) ; yourUrl&#34;))使用url并在将图像设置为ImageView之前在AsyntTask中检查它,只有当标记的url等于AsyntTask下载的图像URL更改了ImageView时。

但为了便于使用和针对不同情况进行多次优化,我建议使用Picasso库在适配器中加载图像。