我无法将来自recyclerview.adapter的图像发送到另一个活动

时间:2017-07-27 17:01:44

标签: android android-recyclerview adapter

@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();
            }
        }
    });
}

这在logCat中显示“无法解码流:java.io.FileNotFoundException:android.support.v7.widget.AppCompatImageView {e22d977 V.ED..C .... P .... 0,0- 540,890#7f0b0061 app:id / img}:open failed:ENOENT(没有这样的文件或目录)“

1 个答案:

答案 0 :(得分:0)

我相信你想关注this answer保存位图图像。我相信你得到FileNotFoundException的原因是因为你提供了一个文件,该文件尚未存在于decodeFile函数中,而这个文件很可能是我所知道的URL。简而言之,要保存位图:

  1. 制作新的File(filename)
  2. 使用步骤1中的文件上的getName解码文件
  3. FileOutputStream
  4. 创建File
  5. 将位图图像压缩为FileOutputStream
  6. 从我的问题可以推测,看起来你在RecyclerView中显示图像,当点击图像时,你想要打开另一个显示完整图像版本的活动。如果这与您的用例很接近,并且您正在使用Glide,我建议利用其内置的自动缓存功能来减少网络呼叫,而不是手动保存文件。

    默认情况下,只要使用相同的文件名,路径或URL获取每个Glide.load(...)上的图像,就会在Glide中启用磁盘和基于内存的缓存。如果您想操纵缓存的发生方式,请在每次加载图像时使用DiskCacheStrategy枚举来控制缓存:

    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而不是直接加载到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
                        }
      });