カスタムListViewでnewsを表示しようとしています。各newsはいくつかのimagesに含まれており、
1.サーバーからimagesをダウンロードします
2.ローカルストレージに保存する
3. path of imagesをSQLiteに保存する
4. show imagesカスタムアダプタを使用したListViewで。
ステップ1&2に問題があります。サーバーからnewsを取得し、ListViewで表示できます。
アダプターに以下のコードを追加して、キャッシュからimagesを表示します。
_Picasso.with(context).load(image[position]).into(iv);
_
Picasso.with(context).load(image[position]).into(target)
を使用することで、保存できます
imageストレージ内。
あなたのアイデアを教えてください...
[〜#〜] update [〜#〜]:以下のコードを使用すると、1つの画像(画像配列の最後のインデックス)だけが保存されます!
このコードですべての画像を配列に保存するにはどうすればよいですか?!
_@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) {
}
};
_
Picasso.with(this).load(image[i]).into(target);
の呼び出しの前にTarget target
定義を配置してください
追伸次のコードを使用して、画像を非常にうまく保存しました。とにかくありがとう。
私のコード:
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);
電話ギャラリーに写真を保存するためのカスタムターゲット。
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"));
この投稿は古いものですが、質問にはまだ回答されていないようです。コードを読むと、picassoへの呼び出しは非同期である可能性があります。それが事実であるかのように、あなたは間違いなくチェックする必要がありますimage.length
タスク。新しいタスクごとにファイル名を変更し、すべてのタスクを完了して、設定された最後のファイル名に保存します。これを解決するには、onBitmapLoaded
リスナーで、タスクの終了時に準備ができるように、Targetコンストラクターをオーバーライドし、ファイル名パラメーターを追加する必要があります。