2015-01-01 17 views
16

ニュースをカスタムで表示しようとしていますListViewニュースは、いくつかの画像の含まれていると私はピカソを使用して画像をダウンロードして保存する

1.download 画像サーバーから

ローカルストレージに2.save

3.save パスの画像にしたいです into SQLite

4.show イメージ私のカスタムアダプタを使用してListViewで。

私はちょうどステップ & に問題があります。私は、サーバーからニュースを取得し、私ののListViewに

をそれらを表示し、自分のアダプタでのコードの下に追加して、キャッシュから画像を表示することができます。

Picasso.with(context).load(image[position]).into(iv); 

Picasso.with(context).load(image[position]).into(target)を使用することにより、ちょうど私が保存することができます1

画像保存中。

は私にあなたのアイデア...

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

代わりにlazylistまたはuniversal image loaderを使用できます。 –

+0

この回答を見てくださいhttp://stackoverflow.com/a/27720638/1576416 –

+0

@ chetの、私はUILライブラリをダウンロードしましたが、私もそれで私の問題を解決することはできません!シンプルなコードを教えてください。 –

答えて

7

前に、 "ターゲットターゲット" の定義を配置しよう "Picasso.with(この).LOAD(画像[i])と(ターゲット)へ;。"。

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); 
+6

このソリューションは、バイトストリームをビットマップにエンコードし、デコードしてファイルに再圧縮します。メモリの例外が発生し、画質が低下します。 –

+0

LightCacheとGlobalConfigが見つかりません。 –

+0

@Programmingvirusこんにちは、コードは単なるサンプルでした。しかし、欠落しているクラスは** LightCache **:https://github.com/MewX/light-novel-library_Wenku8_Android/blob/master/studio-android/LightNovelLibrary/app/src/main/java/org/です。 mewx/wenku8/util/LightCache.java; ** GlobalConfig **:https://github.com/MewX/light-novel-library_Wenku8_Android/blob/master/studio-android/LightNovelLibrary/app/src/main/java/org/mewx/wenku8/global/GlobalConfig .javaこのヘルプが必要です! – MewX

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")); 
1

この記事は古いですが、質問がまだ回答されていないようです。 あなたのコードを読んで、あなたがpicassoに行った呼び出しが非同期である可能性があります。 これは、まるでそうであるかのように、image.lengthタスクを開始し、新しいタスクごとにファイル名を変更し、すべてのタスクを完了させ、最後に設定したファイル名に保存することを確実に確認する必要があります。 これを解決するには、ターゲットコンストラクタをオーバーライドし、タスクが終了したときに準備が整うようにファイル名のパラメータを追加して、onBitmapLoadedリスナで行う必要があります。

関連する問題