Android ListView图像和使用convertView
我正在列表视图中加载图像,并使用convertView添加新项目。我发现当我快速向下滚动时,上面几个屏幕上的图像显示在当前屏幕之前。。在getView中,我正在实例化一个异步任务。我该如何解决这个问题?让图像缓存工作,还是我必须找到一种方法与已启动的异步任务通信,并告诉他们停止加载不会显示的图像 以下是相关代码:Android ListView图像和使用convertView,android,android-listview,android-lru-cache,Android,Android Listview,Android Lru Cache,我正在列表视图中加载图像,并使用convertView添加新项目。我发现当我快速向下滚动时,上面几个屏幕上的图像显示在当前屏幕之前。。在getView中,我正在实例化一个异步任务。我该如何解决这个问题?让图像缓存工作,还是我必须找到一种方法与已启动的异步任务通信,并告诉他们停止加载不会显示的图像 以下是相关代码: @Override public View getView(int position, View convertView, ViewGroup parent) { if (co
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item_course, null);
}
CourseItem courseItem = courseItemList.get(position);
// ImageView
Bitmap bm = courseItem.getPhotoBitmap();
ImageView iv = (ImageView) convertView.findViewById(R.id.imageView1);
iv.setAdjustViewBounds(true);
iv.setMaxHeight(imageWidth);
iv.setMaxWidth(imageWidth);
if (bm != null) {
iv.setImageBitmap(bm);
} else {
CourseItemAndView container = new CourseItemAndView();
container.courseItem = courseItem;
container.view = convertView;
ImageLoader loader = new ImageLoader();
loader.execute(container);
}
...
return convertView;
}
private class CourseItemAndView {
public CourseItem courseItem;
public Bitmap bitmap;
public View view;
}
private class ImageLoader extends AsyncTask<CourseItemAndView, Void, CourseItemAndView> {
@Override
protected CourseItemAndView doInBackground(CourseItemAndView... params) {
CourseItemAndView container = params[0];
CourseItem ci = container.courseItem;
try {
String imageUrl = ci.getSmallIcon();
InputStream in = (InputStream) new URL(imageUrl).getContent();
Bitmap bitmap = BitmapFactory.decodeStream(in);
if (bitmap == null)
System.out.println("HERE");
ci.setPhotoBitmap(bitmap);
in.close();
container.bitmap = bitmap;
return container;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(CourseItemAndView result) {
if (result == null) {
System.out.println("HERE");
} else {
ImageView iv = (ImageView) result.view.findViewById(R.id.imageView1);
iv.setImageBitmap(result.bitmap);
}
}
}
为了使异步任务知道listview的项目位置,以便它在需要将位图放入时可以相应地执行操作,请向异步任务添加位置和listview参数。并使用asynctask实例标记imageview
ImageLoader loader = new ImageLoader(listView, position);
container.view.setTag(loader);
loader.execute(container);
然后,在onPostExecute中,当位置位于listview的可见项之外时,不必放置位图
if( position < listView.getFirstVisiblePosition()
|| position > listView.getLastVisiblePosition()
)
return;
他们不仅应该在imageview看不见时停止,而且应该只在右侧imageview中加载位图。您没有显示任何处理该问题的代码。你也没有告诉我。请发布完整的getView代码。如果convertView不为null,我将重用该视图,因此当我滚动2个屏幕时,两个不同的位图将加载到同一convertView的ImageView子级。除了返回convertView之外,getView中没有其他有用的代码。。。我将尝试发布其他相关代码。
if ( imageView.getTag() != this )
return;
.... place bitmap ..