-2

I am a beginner in android programming.Here i have coded to load images(got using serilizable from previous activity) in viewpager.

The issue that i'm facing - When user is seeing this view pager and presses home button to close the app it crashes and shows error as below in my logcat.I am not getting what's wrong with my code. Your help will be appreciated. Thank You.

My Logcat:

java.lang.RuntimeException: Parcel: unable to marshal value extra.Image@30335200                                                               at android.os.Parcel.writeValue(Parcel.java:1343)                                                               at android.os.Parcel.writeList(Parcel.java:717)                                                               at android.os.Parcel.writeValue(Parcel.java:1290)                                                               at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)                                                               at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)                                                               at android.os.Bundle.writeToParcel(Bundle.java:1034)                                                               at android.os.Parcel.writeBundle(Parcel.java:669)                                                               at android.support.v4.app.FragmentState.writeToParcel(FragmentState.java:120)                                                               at android.os.Parcel.writeTypedArray(Parcel.java:1197)                                                               at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:617) at android.os.Parcel.writeParcelable(Parcel.java:1363)

My Code of previous activity from which this fragment gets called:

  List<Image> images = new ArrayList<Image>();
                                images.add(new Image(data_list.get(arg1).getImage().get(0).toString()));//here my images list  array gets added in images array
                                Bundle bundle = new Bundle();
                                bundle.putSerializable("images", (Serializable) images);
                                bundle.putInt("position", 0);

                                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                                SlideshowDialogFragment newFragment = SlideshowDialogFragment.newInstance();
                                newFragment.setArguments(bundle);
                                newFragment.show(ft, "slideshow");

My Image Model:

public class Image {
    private String Image;
    private String title;
    private String id;

    public Image() {
    }

    public Image(String image, String title, String id) {
        Image = image;
        this.title = title;
        this.id = id;
    }

    public Image(String image) {
        Image = image;
    }

    public String getImage() {
        return Image;
    }

    public void setImage(String image) {
        Image = image;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

My Code of SlideShowDialogFragment.java:

public class SlideshowDialogFragment extends DialogFragment {


    private String TAG = SlideshowDialogFragment.class.getSimpleName();
    private ArrayList<Image> images;
    private ViewPager viewPager;
    private MyViewPagerAdapter myViewPagerAdapter;
    private TextView lblCount, lblTitle, lblDate;
    //  page change listener
    ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            displayMetaInfo(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }
    };
    private int selectedPosition = 0;

    public static SlideshowDialogFragment newInstance() {
        SlideshowDialogFragment f = new SlideshowDialogFragment();
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_image_slider, container, false);
        viewPager = (ViewPager) v.findViewById(R.id.viewpager);
        lblCount = (TextView) v.findViewById(R.id.lbl_count);
        lblTitle = (TextView) v.findViewById(R.id.title);
        lblDate = (TextView) v.findViewById(R.id.date);

        images = (ArrayList<Image>) getArguments().getSerializable("images");
        selectedPosition = getArguments().getInt("position");

        Log.e(TAG, "position: " + selectedPosition);
        Log.e(TAG, "images size: " + images.size());

        myViewPagerAdapter = new MyViewPagerAdapter();
        viewPager.setAdapter(myViewPagerAdapter);
        viewPager.addOnPageChangeListener(viewPagerPageChangeListener);

        setCurrentItem(selectedPosition);

        return v;
    }

    private void setCurrentItem(int position) {
        viewPager.setCurrentItem(position, false);
        displayMetaInfo(selectedPosition);
    }

    private void displayMetaInfo(int position) {
        lblCount.setText((position + 1) + " of " + images.size());

        Image image = images.get(position);
        lblTitle.setText(image.getTitle());
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
    }

    //  adapter
    public class MyViewPagerAdapter extends PagerAdapter {

        private LayoutInflater layoutInflater;

        public MyViewPagerAdapter() {
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {

            layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = layoutInflater.inflate(R.layout.image_fullscreen_preview, container, false);

            ImageView imageViewPreview = (ImageView) view.findViewById(R.id.image_preview);

            Image image = images.get(position);

            Glide.with(getActivity()).load(ConfigClass.BASE_URL + image.getImage())
                    .thumbnail(0.5f)
                    .crossFade()
                    .placeholder(R.drawable.godarpan_logo)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(imageViewPreview);

            container.addView(view);

            return view;
        }

        @Override
        public int getCount() {
            return images.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object obj) {
            return view == ((View) obj);
        }


        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}
Chirag
  • 27
  • 7

2 Answers2

0

Hi please used below code else is same.

 public class Image implements Serializable
  {
   // your code..
  }

In Android used Parcelable instead of serializable to send data from one activity to other.

Please follow below link for Parcelable:

https://developer.android.com/reference/android/os/Parcelable.html

Because Parcelable is a concept of Android where as Serializable is a concept of Java.

hope it helps.

Jyubin Patel
  • 1,373
  • 7
  • 17
0

You have to implement Serializable but its better to implement Parceable because its much faster and efficient than Serializable as it is Android specific interface.

chunkydonuts21
  • 79
  • 1
  • 10