Android延迟加载重新加载列表图像

时间:2014-07-29 21:33:59

标签: android listview lazy-loading

我正在尝试在android中使用listview。我需要从服务器获取listItem图像。我搜索并找到了一些代码。它工作,但当我滚动我的listItem图像正在重新加载。

特此我的代码

 public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View vi = convertView;


    if (vi == null)
        vi = inflater.inflate(R.layout.movierow, parent, false);
    TextView txtMovieName = (TextView) vi.findViewById(R.id.movieName);
    TextView textYear = (TextView) vi.findViewById(R.id.txtMovieYear);

    Movie   movie = data.get(position);

    String  strUrl=String.format( "http://yatanadam.com/FilmLines/admin/FilmImages/%d.png",movie.id);
    final ImageView img=(ImageView) vi.findViewById(R.id.imgMovieRow);

    img.setTag(position);

    new DownloadImageTask(img,position)
       .execute(strUrl);

    textYear.setText(movie.year);

    txtMovieName.setText(movie.name);

    return vi;
}

public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImageVw;
int imgVwId;


public DownloadImageTask(ImageView bmImage,int id) {
    this.bmImageVw = bmImage;
    this.imgVwId=id;
}


protected Bitmap doInBackground(String... urls) {
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.e("Error","ERRORdoInBackground");
        e.printStackTrace();
    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {

    if (this.imgVwId==this.bmImageVw.getTag()){

        bmImageVw.setImageBitmap(result);
    }
}

IMGSCROLLED

IMGFIRST

有没有人可以帮助我?我在这上面超过4个小时。 THX。

2 个答案:

答案 0 :(得分:0)

1)覆盖适配器上的下一个方法:

@Override
public boolean hasStableIds(){ return true; }

2)添加缓存方法以避免第二次下载图像。 您可以在http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

上找到有关缓存图像的更多信息

希望这个帮助

答案 1 :(得分:0)

我认为你应该使用任何这些库来帮助缓存加载的图像。

Android通用图像加载器的示例应用已实现在listview中加载图像。你可以使用它。