列表视图中的图像从行跳到行

时间:2014-02-17 21:49:34

标签: java android image listview android-listview

我正在使用带有图像的ListView,我也有一个图像加载器。问题是,当快速滚动时,图像会显示在错误的行上,在滚动停止后的短时间内,每个东西都会回到原位。

这是我的适配器:

public class MyAdapter extends ArrayAdapter<MyObj> 
{
    int                     layoutResourceId;
    List<MyObj> data;
    Activity                activity;
    int                     rowViewId;

    public MyAdapter(Activity activity, int layoutResourceId, List<MyObj> data)
    {
        super(activity, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.activity = activity;
        this.data = data;
        rowViewId = R.layout.my_layout.xml;
    }

    public static class ViewHolder
    {
        public TextView title;
        public ImageView image;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View row = convertView;
        ViewHolder holder;


        if (row == null) 
        {
            LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            row = layoutInflater.inflate(rowViewId, null);
            holder = new ViewHolder();
            holder.title = (TextView) row.findViewById(R.id.title);
            holder.image = (ImageView) row.findViewById(R.id.image);
            row.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) row.getTag();
        }

        final MyObj obj = data.get(position);

        if (event != null) 
        {
            holder.title.setText(event.getTitle());
            ImageLoader imageLoader = new ImageLoader();
            imageLoader.loadImageFromAppServer(obj.getImageName(), holder.image);
        }

        return row;
    }
}

我能做些什么来防止这种不必要的行为?

1 个答案:

答案 0 :(得分:1)

您的图片由loadImageFromAppServer异步加载。当它从服务器到达时,您的holder.image对象已被另一行重用,该行不代表您在请求ImageLoader对象下载图像时所执行的相同数据。您需要实现一种方法来告诉ImageLoader对象取消先前的下载请求。