所以我的应用程序列出了给定Dropbox文件夹中的所有文件和文件夹。它们使用适配器列在自定义ListView中。
目前我使用drawables作为图像和文件夹图标。我遍历Dropbox文件夹结构并将所需的drawable添加到Bitmap数组。这是在异步任务(doInBackground
)中完成的。
然后我在PostExecute
中调用适配器,如下所示:
adapter = new ImageAdapter(this, pix, paths);
lstView.setAdapter(adapter);
然后在ListView中显示所有文件和图像(带有默认的可绘制图标)。
我想要做的下一步是从Dropbox开始加载缩略图。 因此,对于List中的每个图像,我想用从Dropbox中检索到的缩略图替换drawable。 同样,这应该在异步任务中完成,这样用户仍然可以滚动列表视图。
使用dropbox,您可以加载这样的缩略图:
if(fileInfo.thumbExists)
{
file = fileSystem.openThumbnail(fileInfo.path, ThumbSize.XS, ThumbFormat.PNG);
Bitmap image = BitmapFactory.decodeStream(file.getReadStream());
thumbs.add(image);
file.close();
}
在上面的代码中,thumbs
是一个位图数组。
我打算使用Universal Image Loader或Picasso。但是你不能将Bitmap数组传递给其中任何一个。它必须是URL或URI。
我怎样才能做到这一点?我猜我需要另一个异步任务,但我不确定如何更新我的适配器。
注意事项:
我不想等到之前下载所有缩略图 开始显示它们
如果有很多缩略图,是否会考虑内存?
请记住 - 我使用的是一系列位图,我没有任何网址。我是否最好将每个位图保存到SD卡,然后使用UIL或Picasso加载URI?但是你怎么知道哪些图像进入了ListView中的哪个位置?
所以我的代码中的步骤最好是:
- 在Listview中加载带有虚拟图像的文件和文件夹(已经这样做了!)
- 从decodeStream获取缩略图并加载到位图数组
- 将缩略图放入ListView中的正确位置
答案 0 :(得分:0)
对于列表视图的每一行,运行单独的线程以下载并显示缩略图图像。 我想,您可以避免使用位图数组并直接将下载的图像提供给列表视图行。
I)修改适配器的getView()回调,如下所示:
ImageView thumbnail = Container.findViewById(R.id.thumbnail) loadImageInBackground(缩略图,URL).execute();
II)loadImageInBackground将是一个实现AsyncTask
的类a)数据成员:ImageView缩略图,字符串URL
b)构造函数:使用传递的实例初始化这些数据成员。
c)onPostExecute:将虚拟图像设置为此处的缩略图,直到下载所需图像为止。您甚至可以在此处设置动画图像以使其更好。
d)doInBackground:
mUrl = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bmImg = BitmapFactory.decodeStream(is);
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
e)onPostExecute:将this.thumbnail与this.bmImg相关联。
这样,对于列表视图的每一行,将初始化loadImageInBackground类的对象,并从URL下载图像并将其设置为相应行的图像View容器。
图像将在下载后立即显示在缩略图上。没有阻止,我的意思是,即使正在下载图像,用户也可以与应用程序进行交互。 如果您已经实现了延迟加载方法,那么这种方法在任何情况下都不会导致任何outOfMemory异常。而且,只有在用户滚动时才会下载新图像。 Point II.c提供在缩略图上设置加载动画/图像,直到下载实际图像为止。