自定义SimpleCursor适配器BindView调用

时间:2015-02-01 19:34:32

标签: android bitmap android-asynctask simplecursoradapter pull-to-refresh

我想知道是否有办法让每个项目仅使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的动作也可能在慢速手机上可见)

提前致谢!

1 个答案:

答案 0 :(得分:0)

ListView的重点是回收行视图。它们不会被销毁,它们会被传递回适配器以与另一行的新数据绑定。如果您将一个项目从屏幕上滚动得足够远,然后将其向后滚动到屏幕上,则应该再次调用getView(或者在游标适配器的情况下为bindView)。

您需要的是下载任务和适配器之间的图像缓存层。发生bindView时,首先检查缓存以查看图像是否存在。如果是,请使用它。如果不是,请下载并将其添加到缓存中,然后使用它。