我想知道是否有办法让每个项目仅使BindView工作一次?
我们滚动屏幕的项目是否被销毁?当他们回来时我们必须再次运行bindview?
原因是我得到了适配器以下载图像并将其设置在项目上。
当我滚动图像时,即使我没有退出应用程序也会再次下载。
每次项目“返回”显示时都会调用bindview,所以即使我已经下载了它,它也会再次执行asyntask(在适配器中调用asyntask)
我甚至尝试在每次下载后在我的数据库上保存BLOB,知道何时调用asyntast以及何时只是从数组中创建一个位图
if(photoBArray != null){
Bitmap bitmap = BitmapFactory.decodeByteArray(photoBArray, 0, photoBArray.length);
holder.icon.setImageBitmap(bitmap);
}else{
holder.icon.setImageResource(R.drawable.loader);
String urlString = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=100&photoreference="
+ c.getString(c.getColumnIndex(PlacesDBHelper.PHOTO_REFERENCE_COL))+"&key=API_KEY";
Log.e("Photo REFERENCE", c.getString(c.getColumnIndex(PlacesDBHelper.PHOTO_REFERENCE_COL)));
try {
URL url = new URL(urlString); // create new URL object from url string
new ImageDownloader(holder.icon, this).execute(url);
}catch (Exception e){
Log.e("Error in url", e.getMessage());
}
}
我正在使用chrisbanes pulltorefresh listview,我不确定这是否是问题的原因
底线问题:当他回到屏幕并且不再创建项目时,如何使项目看起来稳定并准备就绪? (因为即使我没有下载图像并只设置位图,setimagebitmap的动作也可能在慢速手机上可见)
提前致谢!
答案 0 :(得分:0)
ListView
的重点是回收行视图。它们不会被销毁,它们会被传递回适配器以与另一行的新数据绑定。如果您将一个项目从屏幕上滚动得足够远,然后将其向后滚动到屏幕上,则应该再次调用getView
(或者在游标适配器的情况下为bindView
)。
您需要的是下载任务和适配器之间的图像缓存层。发生bindView
时,首先检查缓存以查看图像是否存在。如果是,请使用它。如果不是,请下载并将其添加到缓存中,然后使用它。