【问题标题】:How to send data using putExtra of the an Adapter Class to a new Activity如何使用适配器类的 putExtra 将数据发送到新活动
【发布时间】:2015-10-12 16:05:45
【问题描述】:

我在使用 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();
        }
}

Follow 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;
}

关注我的类适配器(在这个类中,我使用 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 Class Activity 我通过以下方式获取信息

 Consultorio mConsultorio;

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

【问题讨论】:

  • 您遇到了什么问题或错误
  • 您能与我们分享您的问题吗?
  • 类适配器的 onClick "public void onClick(View view)" 工作正常,但 putExtras 不工作。当我进入新活动时,对象“mConsultorio”返回空。
  • Android Studio 不返回任何错误。只有 mConsultorio 对象返回空
  • 您好,我的朋友...问题已在 Consultorio 课程中以 parcelable 形式解决。“Youngjae”的评论对我有帮助。谢谢大家

标签: android android-intent parcelable


【解决方案1】:

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 插件。它会自动为你生成类的 Parcelable i/o。安装好插件后,在类名上右击,点击“Generate...”>“Parcelable”菜单。

【讨论】:

  • Yeahhhhhhhhhhhhhhhhhhhhhhhhhhhmy朋友..现在工作......非常好..非常好..你这么好! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多