我试图在自定义 ListView 中显示新闻。每个新闻都包含在一些图片中,我想
1.从服务器下载图像
2.save in local storage
3.将图片的路径保存到SQLite中
4.使用我的自定义适配器在ListView中显示图像。
我对步骤 1 &的 2 即可。我可以从服务器获取新闻并在我的 ListView
中显示它们通过在我的适配器中添加以下代码,从缓存中显示图像:
Picasso.with(context).load(image[position]).into(iv);
使用Picasso.with(context).load(image[position]).into(target)
,我可以保存一个
图像。
请建议我你的想法......
UPDATE :当我使用下面的代码时,只保存一个图像(我的图像数组的最后一个索引)!
如何使用此代码保存数组中的所有图像?!
@Override
protected void onPostExecute(Void result) {
SaveImages();
pDialog.dismiss();
super.onPostExecute(result);
}
String fileName = null;
public void SaveImages() {
for(int i = 0; i < image.length; i++) {
Picasso.with(this).load(image[i]).into(target);
fileName = "image-" + i + ".jpg";
}
}
Target target = new Target() {
@Override
public void onPrepareLoad(Drawable arg0) {
}
@Override
public void onBitmapLoaded(Bitmap bitmap, LoadedFrom arg1) {
File file = new File(Environment.getExternalStorageDirectory().getPath() +"/" + fileName);
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 75, ostream);
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBitmapFailed(Drawable arg0) {
}
};
答案 0 :(得分:7)
尝试放置&#34;目标目标&#34;定义之前&#34; Picasso.with(this).load(image [i])。into(target);&#34;。
P.S。在这里,我使用此代码并很好地保存图像。不管怎样,谢谢。
我的代码:
final String fileName = mDataset.get(i).getAid() + ".jpg";
Target target = new Target() {
@Override
public void onPrepareLoad(Drawable arg0) {
return;
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom arg1) {
try {
File file = null;
// judge "imgs/.nomedia"'s existance to judge whether path available
if(LightCache.testFileExist(GlobalConfig.getFirstStoragePath()
+ "imgs" + File.separator +".nomedia") == true)
file = new File(GlobalConfig.getFirstStoragePath()
+ "imgs" + File.separator + fileName);
else file = new File(GlobalConfig.getSecondStoragePath()
+ "imgs" + File.separator + fileName);
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, ostream);
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBitmapFailed(Drawable arg0) {
return;
}
};
Picasso.with(GlobalConfig.getContext())
.load(Wenku8API.getCoverURL(mDataset.get(i).getAid()))
.into(target);
答案 1 :(得分:2)
在手机图库中存储照片的自定义目标。
public class TargetPhoneGallery implements Target
{
private final WeakReference<ContentResolver> resolver;
private final String name;
private final String desc;
public TargetPhoneGallery(ContentResolver r, String name, String desc)
{
this.resolver = new WeakReference<ContentResolver>(r);
this.name = name;
this.desc = desc;
}
@Override
public void onPrepareLoad (Drawable arg0)
{
}
@Override
public void onBitmapLoaded (Bitmap bitmap, LoadedFrom arg1)
{
ContentResolver r = resolver.get();
if (r != null)
{
MediaStore.Images.Media.insertImage(r, bitmap, name, desc);
}
}
@Override
public void onBitmapFailed (Drawable arg0)
{
}
}
Picasso.with(context).load(image[position]).into(new TargetPhoneGallery(view.getContentResolver(), "image name", "image desc"));
答案 2 :(得分:1)
虽然这篇文章很老,但似乎还没有回答这个问题。
阅读你的代码,你对毕加索的调用似乎是异步的。
你应该检查,就好像是这样,你正在开始image.length
任务,更改每个新任务的文件名,导致所有任务完成并保存到最后设置的文件名。
要解决这个问题,你应该覆盖Target构造函数并添加一个filename参数,以便在任务结束时准备就绪,在onBitmapLoaded
监听器中。