0

I have retrieved Images in the RecyclerView , now i want when each Image item is clicked , the Image saves itself into the gallery.

Here it's how i set my Image to the ImageView in the Adapter.

viewHolder.setImage(c, model.getEventImage());

then , here its how i was handling the click Event in the Adapter.

 viewHolder.imagePost.setOnClickListener(new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {

                             viewHolder.SaveImage(viewHolder.imagePost);
                         }
                     });

And this is my Viewholder class where i declared my ImageView.

public static class BlogViewHolder extends RecyclerView.ViewHolder{


        View mView;

        private ImageView imagePost;
        private  ImageView save_image_blog;
        private FullscreenVideoLayout videoLayout;
        private Context cx;
         ImageView videoView;
        public BlogViewHolder(View itemView) {
            super(itemView);
            mView=itemView;
            imagePost =(ImageView)mView.findViewById(R.id.post_image);
             save_image_blog =(ImageView)mView.findViewById(R.id.save_image_blog);
            videoLayout = (FullscreenVideoLayout) mView.findViewById(R.id.post_video);
            videoView = (ImageView) mView.findViewById(R.id.videoview);



        }


        public void setImage(final Context c,final String imageUrl) {


            int size = (int) Math.ceil(Math.sqrt(MAX_WIDTH * MAX_HEIGHT));
            //

            Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).placeholder(R.mipmap.add_btn)
                    .transform(new BitmapTransform(MAX_WIDTH, MAX_HEIGHT))
                    .skipMemoryCache()
                    .networkPolicy(NetworkPolicy.OFFLINE).into(imagePost, new Callback() {
                @Override
                public void onSuccess() {

                }

                @Override
                public void onError() {

                    //Reloading an image again ...
                    Picasso.with(c).load(imageUrl).error(R.mipmap.add_btn).placeholder(R.mipmap.add_btn)
                            .into(imagePost);
                }
            });


        }

                   public  void SaveImage(ImageView img){

            img.buildDrawingCache();

            Bitmap bmp = img.getDrawingCache();

            File storageLoc = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); //context.getExternalFilesDir(null);

            File file = new File(storageLoc, "Pixsar" + ".jpg");

            try{
                FileOutputStream fos = new FileOutputStream(file);
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                fos.close();

                scanFile(cn, Uri.fromFile(file));

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            Toast.makeText(cn,"Image Saved to gallery ",Toast.LENGTH_LONG).show();
        }


    }

The issue is when i try to click on the Image i get a null pointer , below is the logcat.

java.lang.NullPointerException
                                                                                  at company.override.huzykamz.pixsar.BlogScrolling$BlogViewHolder.SaveImage(BlogScrolling.java:343)
                                                                                  at company.override.huzykamz.pixsar.BlogScrolling$2$1.onClick(BlogScrolling.java:210)
                                                                                  at android.view.View.performClick(View.java:4438)
                                                                                  at android.view.View$PerformClick.run(View.java:18422)
                                                                                  at android.os.Handler.handleCallback(Handler.java:733)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                  at android.os.Looper.loop(Looper.java:136)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5001)
                                                                                  at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                  at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                                  at dalvik.system.NativeStart.main(Native Method)

Below are the specific lines.

 at company.override.huzykamz.pixsar.BlogScrolling$BlogViewHolder.SaveImage(BlogScrolling.java:343)
                                                                                  at company.override.huzykamz.pixsar.BlogScrolling$2$1.onClick(BlogScrolling.java:210)

My full Adapter is below

 try {
            FirebaseRecyclerAdapter<Posts, BlogScrolling.BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Posts, BlogScrolling.BlogViewHolder>(Posts.class,
                    R.layout.item_activity,
                    BlogScrolling.BlogViewHolder.class,
                    mDatabase) {
                @Override
                protected void populateViewHolder(final BlogScrolling.BlogViewHolder viewHolder, final Posts model, final int position) {

                    final String key_post = getRef(position).getKey();
                    final String videoUrl = model.getEventVideo();

                    try {
                        viewHolder.setTitle(model.getEventTitle());
                        viewHolder.setDesc(model.getEventDescription());
                        viewHolder.setImage(c, model.getEventImage());
                        viewHolder.setGif(c,model.getEventVideo());





                     viewHolder.imagePost.setOnClickListener(new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
                             BlogViewHolder holder = (BlogViewHolder)(v.getTag());
                             holder.SaveImage(holder.imagePost);
                         }
                     });

                    viewHolder.videoView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            //          Toast.makeText(getApplicationContext()," position "+ position,Toast.LENGTH_LONG);
                            Intent i = new Intent(BlogScrolling.this,VideoActivity.class);
                            i.putExtra("VideoUrl", videoUrl);
                            startActivity(i);
                        }
                    });}


                    catch (NullPointerException e){

                }
                //    final String key_post_image = getRef(position).getKey();




                }
            };

            mRecyclerview.setAdapter(firebaseRecyclerAdapter);
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807

2 Answers2

0

You wont have the viewHolder object inside onClick listener. Check this answer :getting-a-reference-to-viewholder-on-recyclerview-click

set imagePost.setTag(this) in BlogViewHolder constructor. and in public void onClick(View v) do:

BlogViewHolder viewHolder= (BlogViewHolder)(v.getTag());
viewHolder.SaveImage(viewHolder.imagePost);
Community
  • 1
  • 1
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
  • according to your code you didnt use the Object `holder` –  Dec 12 '16 at 11:38
  • you are using v – Suraj Rao Dec 12 '16 at 11:40
  • Ok , thanks man let me run and see the output , ill let you know –  Dec 12 '16 at 11:43
  • Man theres still the same problem `nullPointer`, i dont know where am wrong , i have also uploaded my full Adapter , please check it . Thanks –  Dec 12 '16 at 11:50
  • Yes same location –  Dec 12 '16 at 12:08
  • do you have any good attempt on this , because i have searched everywhere but am not seeing a good example of saving Images from the List to the gallery –  Dec 12 '16 at 14:20
  • http://r.search.yahoo.com/_ylt=A2oKmMqdsk5YBg8AsdGsniM5;_ylu=X3oDMTByN2RnanRxBHNlYwNzcgRwb3MDMQRjb2xvA3NnMwR2dGlkAw--/RV=2/RE=1481581342/RO=10/RU=http%3a%2f%2fstackoverflow.com%2fquestions%2f24471109%2frecyclerview-onclick/RK=0/RS=ovK.ijDfM4I.lpveTtJvVeDCpeg- – Suraj Rao Dec 12 '16 at 14:24
  • Thanks Suraj , but i thought there's a direct link talking about **saving Images from a RecyclerView, into the gallery** , coz what i just saw its the same story. It wont help me out. Its really a wonder, if theres no such an example . –  Dec 12 '16 at 14:41
  • i am not sure of how it can be done without restructuring the viewholder/listener.. – Suraj Rao Dec 12 '16 at 14:43
  • Ok @Suraj , if you have a good example after reconstructing it , please share –  Dec 12 '16 at 14:52
0

setTag inside populateViewHolder()

imagePost.setTag(viewHolder)

and in public void onClick(View v) do:

BlogViewHolder viewHolder= (BlogViewHolder)(v.getTag());
viewHolder.SaveImage(viewHolder.imagePost);
Ankita Shah
  • 1,866
  • 16
  • 31
  • what do you mean by inside` populateViewHolder()` , and `setTag(viewHloder)` is not accessible in the `BlogViewHolder` class –  Dec 12 '16 at 13:41
  • Man , it still says NullPointer Exception , please give me another solution .Thanks –  Dec 12 '16 at 14:19