如何使用适配器类的putExtra将数据发送到新的Activity

时间:2015-10-12 16:05:46

标签: android android-intent parcelable

我有一个问题,就是使用putExtra(适配器类的一个新Activity)发送数据。我认为我的问题是Parcelable,但我找不到问题所在。

跟着我的课,让你明白了。

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

关注My Class Fragment(因为我正在使用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;
}

关注我的CLASS适配器(在这个类我使用putExtra发送数据一个新的活动)

   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课程活动我通过

获取信息
 Consultorio mConsultorio;

 mConsultorio = getIntent().getParcelableExtra("consultorio");

1 个答案:

答案 0 :(得分:2)

parcelable 应保持写入和读取成员的顺序。您的writeToParcel方法先写int photo,然后string nome,但readFromParcel方法请先阅读int photo

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

我强烈建议您在Android Studio中查找并安装 Android Pacelable Code Generator 插件。它会自动为您生成Class的Parcelable i / o。安装插件后,只需右键单击类名,然后单击&#34;生成...&#34; &GT; &#34; Parcelable&#34;菜单。