2017-07-27 1 views
0
@Override 
public void onBindViewHolder(final ViewHolder holder ,int position) { 
    Glide.with(c) 
      .load(images.get(position)) 
      .placeholder(R.mipmap.ic_launcher) 
      .into(holder.img); 
    holder.img.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      try{ 
       String fileName = "bitmap.png"; 
       FileOutputStream stream = c.openFileOutput(fileName,Context.MODE_PRIVATE); 
       Intent showBigPicture = new Intent(c,showBigPicture.class); 
       Bitmap bitmapImage = BitmapFactory.decodeFile(images.get(position)); 
       bitmapImage.compress(Bitmap.CompressFormat.PNG,100,stream); 
       stream.close(); 
       bitmapImage.recycle(); 
       showBigPicture.putExtra("image",fileName); 
       c.startActivity(showBigPicture); 

      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

にrecyclerview.adapterから画像を送信することができません」ができないストリームを復号化する:java.io.FileNotFoundException:android.support.v7.widget.AppCompatImageView {e22d977 V.EDを..C ... P ... 0,0-540,890#7f0b0061 app:id/img}:オープンに失敗しました:ENOENT(そのようなファイルやディレクトリはありません) "IこれはlogCatに表示されている別の活性

+0

あなたは次のアクティビティにファイル名を渡しているようです。ビットマップを作成する理由はありますか? – ono

答えて

0

あなたはthis answerをビットマップ画像を保存する。私はあなたがFileNotFoundExceptionを取得している理由は、あなたがまだ私が知ることのできるURLである可能性のあるdecodeFile関数にはまだ存在しないファイルにURIを提供しているからです。 FileOutputStream にビットマップ画像を圧縮File

  • から

    1. ステップ1
    2. からファイル上のgetNameを使用して、新しいFile(filename)
    3. デコードファイルを作成しますFileOutputStream:要するに、ビットマップを保存します

    私はあなたの質問から推測できるところから、あなたはRecyclerViewで画像を表示しているように見え、画像がフルイメージのバージョンを示す別のアクティビティを開きたいとします。それがあなたのユースケースの近くで、あなたがGlideを使っているならば、ファイルを手動で保存するのではなく、ネットワークコールを減らすために内蔵の自動キャッシュ機能を利用することをお勧めします。

    デフォルトでは、ディスク名とメモリベースのキャッシングは、それぞれのファイル名、パス、またはURLがそれぞれのGlide.load(...)でイメージを取得するために使用されている限り、Glideで有効になっています。あなたはまだ他の理由のためにファイルを保存したい場合は、

    Glide.with(c) 
         .load(images.get(position)) 
         .diskCacheStrategy(DiskCacheStrategy.SOURCE) # Will cache the source downloaded image before any transformations are applied 
         .placeholder(R.mipmap.ic_launcher) 
         .into(holder.img);  
    

    の代わりSimpleTargetを使用する:あなたはキャッシングが発生する方法を操作したい場合は、イメージをロードするたびにことを制御するためにDiskCacheStrategy列挙型を使用しますあなたのImageViewに直接ロードする:

    Glide.with(c) 
         .load(images.get(position)) 
         .diskCacheStrategy(DiskCacheStrategy.SOURCE) # Will cache the source downloaded image before any transformations are applied 
         .placeholder(R.mipmap.ic_launcher) 
         .asBitmap() 
         .into(new SimpleTarget<GlideDrawable>() { 
            @Override 
            public void onResourceReady(Bitmap bitmap, GlideAnimation anim) { 
             holder.img.setImageDrawable(new BitmapDrawable(bitmap)); 
             saveImage(bitmap); # This being an encapsulation of the steps outlined earlier 
            } 
        }); 
    
  • +0

    はい、そうですが、フルサイズの画像を別のアクティビティで表示したいのですが、そのために.diskCacheStrategyを使用する方法を理解できません。 – ray1195

    +0

    プレビューアクティビティとフルサイズの画像アクティビティの両方で、Glideローダーでその行を使用するだけです。適切なキャッシングが使用されているかどうかをテストする最良の方法は、すべてのアプリデータを消去し、プレビューアクティビティを読み込んでイメージがダウンロードされていることを確認した後、ネットワーク接続をすべてオフにしてフルサイズのアクティビティを読み込みます。フルサイズのアクティビティのイメージは、キャッシュに保存されたフルサイズのイメージから読み込まれます。 – shiv

    関連する問題