0

I have a problem to send data using putExtra (of the a Adapter Class to an new Activity). I think that my problem is in Parcelable, but I cannot find where there are the problem.

Follow my class for you understand better.

Consultorio.class

   public class Consultorio implements Parcelable {

        private String nome;
        private int photo;

     public Consultorio() {
      }

    * @param nome
    * @param photo
    public Consultorio( String nome, int Photo)) {

       this.nome =  nome;
       this.photo = photo;

    }

   /**
   * @return
   */
   public String getNome() {
     return nome;
   }

   /**
   * @param nome
   */
   public void setNome(String nome) {
       this.nome = nome;
   }

   public int getPhoto() {
      return photo;
   }

   public void setPhoto(int photo) {
       this.photo = photo;
   }

   //PARCELABLE
   public Consultorio(Parcel parcel){
       setNome(parcel.readString());
       setPhoto(parcel.readInt());
   }

   @Override
   public int describeContents() {
       return 0;
   }

   @Override
   public void writeToParcel(Parcel dest, int flags) {
       dest.writeInt(photo);
       dest.writeString(nome);

   }

   public static final Parcelable.Creator CREATOR = new   Parcelable.Creator<Consultorio>() {
       @Override
       public Consultorio createFromParcel(Parcel source) {
           return new Consultorio(source);
       }

       @Override
       public Consultorio[] newArray(int size) {
           return new Consultorio[size];
       }
   };

   public void readFromParcel(Parcel in) {
     nome = in.readString();
     photo = in.readInt();
        }
}

Follow My Class Fragment (because I'm using TabLayout)

   public class ClinicaMedicaFragment extends Fragment {

      private List<Consultorio> consultorioList = new ArrayList<Consultorio>();
      private ClinicaAdapter adapter;
      private Toolbar toolbar;

      @Override
      public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
      View v =inflater.inflate(R.layout.clinica_medica_fragment, container, false);

      RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.clinica_recyclerView);
      toolbar = (Toolbar) v.findViewById(R.id.tb_main);

      GridLayoutManager manager = new GridLayoutManager(v.getContext(),
             2, GridLayoutManager.VERTICAL, false);
      manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
         @Override
         public int getSpanSize(int position) {
             return (position % 3 == 0 ? 2 : 1);
         }
     });
     recyclerView.setLayoutManager(manager);

     List<Consultorio> list = new ArrayList<Consultorio>();
     Consultorio c0 = new Consultorio();
     c0.setPhoto(R.mipmap.img1);
     c0.setNome("Name 1");

     Consultorio c1 = new Consultorio();
     c1.setPhoto(R.mipmap.img2);
     c1.setNome("Name 2");

     Consultorio c2 = new Consultorio();
     c2.setPhoto(R.mipmap.img3);
     c2.setNome("Name 3");

    list.add(c0);
    list.add(c1);
    list.add(c2);

    consultorioList = list;

    adapter = new ClinicaAdapter(list);
    recyclerView.setAdapter(adapter);
    return v;
}

Follow My CLASS Adapter (in this class I'm using putExtra for send datato an new Activity)

   public class ClinicaAdapter extends RecyclerView.Adapter<ClinicaAdapter.ViewHolder>{
private List<Consultorio> consultorioList;
//protected Boolean isHomeList = false;


     public ClinicaAdapter(List<Consultorio> data) {
      consultorioList = data;
     }

     @Override
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.clinica_medica_item, parent, false);
     return new ViewHolder(itemView);
   }

   @Override
   public void onBindViewHolder(final ViewHolder holder, final int position) {

      final Consultorio consultorio = consultorioList.get(position);
      holder.imageViewPhoto.setImageResource(consultorio.getPhoto());

      holder.imageViewPhoto.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View view) {
               Intent intent = new Intent(view.getContext(), ClinicaActivity.class);
               intent.putExtra("consultorio", consultorio);
               view.getContext().startActivity(intent);
           }
       });
    }

    @Override
    public int getItemCount() {
      return consultorioList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        ImageView imageViewPhoto;

        public ViewHolder(View itemView) {
        super(itemView);
        imageViewPhoto = (ImageView) itemView.findViewById(R.id.clinc_img);
    }
}

Inmy Class Activity I pick up information by

 Consultorio mConsultorio;

 mConsultorio = getIntent().getParcelableExtra("consultorio");
André Vitor
  • 59
  • 1
  • 13

1 Answers1

2

The parcelable should maintain order of write and read members. Your writeToParcel method write int photo first and then string nome, but readFromParcel method read int photo secondly.

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(nome); // <- I changed nome firstly.
    dest.writeInt(photo);
}


public void readFromParcel(Parcel in) {
    nome = in.readString();
    photo = in.readInt();
}

I strongly recommend you to find and install Android Pacelable Code Generator plugin in Android Studio. It will automatically generate Parcelable i/o of the class for you. After installing the plugin, just right click at the class name, and click "Generate..." > "Parcelable" menu.

Youngjae
  • 24,352
  • 18
  • 113
  • 198