2

我有一个RecyclerView利用回收者适配器输出列表布局,像这样:传递模型对象到另一个活动

http://i.imgur.com/ORkXXTb.png

我需要在模型下方附上每个列表项,这样如果用户点击列表项中的任何元素(如圆圈或两个TextView中的一个),它将模型对象传递给下一个Activity

这里是User模型:

public class User { 

    private String id; 
    private String username; 
    private String displayName; 
    private Object deletedAt; 
    private Statistic stat; 

    public String getId() { 
     return id; 
    } 

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

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username= username; 
    } 

    public String getDisplayName() { 
     return displayName; 
    } 

    public void setDisplayName(String displayName) { 
     this.displayName = displayName; 
    } 

    public Object getDeletedAt() { 
     return deletedAt; 
    } 

    public void setDeletedAt(Object deletedAt) { 
     this.deletedAt = deletedAt; 
    } 

    public Statistic getStat() { 
     return stat; 
    } 

    public void setStat(Statistic stat) { 
     this.stat = stat; 
    } 

} 

下面是每个列表项的布局(user_layout.xml):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/user_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <RelativeLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@color/white"> 

      <ImageView 
       android:id="@+id/avatar" 
       android:layout_width="50dp" 
       android:layout_height="50dp" 
       android:layout_alignParentLeft="true" 
       android:background="@drawable/avatar" /> 


      <TextView 
       android:id="@+id/display_name" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignTop="@+id/avatar" 
       android:layout_toRightOf="@+id/avatar" 
       /> 

      <TextView 
       android:id="@+id/username" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_below="@+id/display_name" 
       /> 

     </RelativeLayout> 

    </LinearLayout> 

</LinearLayout> 

这里是所使用充气上述布局中的UserRecyclerAdapter

public class UserRecyclerAdapter extends RecyclerView.Adapter<UserRecyclerAdapter.ViewHolder> { 

    private Context context; 
    private List<User> mDataset; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public ImageView avatar; 
     public TextView displayName; 
     public TextView username; 

     public ViewHolder(LinearLayout view) { 
      super(view); 

      avatar = (ImageView) view.findViewById(R.id.avatar); 
      displayName = (TextView) view.findViewById(R.id.display_name); 
      username = (TextView) view.findViewById(R.id.username); 
     } 
    } 

    public UserRecyclerAdapter(Context context, List<User> myDataset) { 
     this.context = context; 
     this.mDataset = myDataset; 
    } 

    @Override 
    public UserRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_layout, parent, false); 
     ViewHolder vh = new ViewHolder((LinearLayout) view); 

     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     User userItem = mDataset.get(position); 

     holder.displayName.setText(userItem.getDisplayName()); 
     holder.username.setText(userItem.getUsername()); 
    } 

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

} 

所以我的问题是,如何将User模型对象附加到每个列表项目,以便在单击某个元素(如圆形或两个TextView)时,它会将模型对象传递给下一个Activity

谢谢。

回答

3

使用户实现Parceable接口。

如果您使用的是Android Studio,那么有一个很棒的插件可以帮助您获得所谓的“Android Parcelable code generator”。有了这个插件,你可以只自动生成所有必要的代码,但其基本思想如下:

你需要一个空的构造:

public User() {} 

然后实现接口中的方法:

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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(id); 
    dest.writeString(userName); 
    dest.writeString(displayName); 
    ... 
    // Any object to be added to dest must implement Parceable in its turn 
    // Please note that Lists and Serializable objects are already supported out of the box 
} 

public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { 

    @Override 
    public EventFrame createFromParcel(Parcel source) { 
     return new User(source); 
    } 

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

private EventFrame(Parcel source) { 
    id = source.readString(); 
    accessToken = source.readString(); 
    displayName = source.readString(); 
    ... 
} 

之后,创建下一个活动的意图时,请执行以下操作:

Intent yourIntent = new Intent(this, DestinyClass.class); 
yourIntent.putExtra("user_identifier", user); 
+1

如何模型对象附加到列表项的布局,虽然,这样当在布局中的元素被点击时,它使用那个特定的模型对象实例。 – user5314557

+0

这是一个不同的问题,我建议你看一下RecyclerView的一些例子,所以这些例子很多。无论如何,评论部分不是讨论该答案的地方,只是为此创建另一个问题。检查这个链接https://developer.android.com/training/material/lists-cards.html –

+0

我觉得你很困惑。我不问如何制作RecyclerView。我明白了。我问如何将对象附加到布局,以便在单击布局元素时将对象发送到下一个活动。 – user5314557

2

使用this library

@Parcel 
public class User { 
    public User() {} 
    // You can keep all the members private with @Parcel(Serialization.BEAN) 
    public String id; 
    public String username; 
    public String displayName; 
    public Object deletedAt; 
    public Statistic stat; // Needs to be @Parcel annotated as well 
} 

ActivityA.java 
void openActivityB() { 
    Intent intent = new Intent(this, ActivityB.class); 
    intent.putExtra("user", Parcels.wrap(user)); 
    startActivity(intent); 
} 

ActivityB.java 
void receive() { 
    User user = Parcels.unwrap(getIntent().getParcelableExtra("user")); 
} 

更新:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    User userItem = mDataset.get(position); 

    holder.displayName.setText(userItem.getDisplayName()); 
    holder.username.setText(userItem.getUsername()); 

    setOnClickListener(... 
     onClick() { 
      Context context = holder.displayName.getContext(); 
      Intent intent = new Intent(context, ActivityB.class); 
      intent.putExtra("user", Parcels.wrap(userItem)); 
      context.startActivity(intent); 
    }); 
} 
+0

尽管如何将对象附加到列表项布局?换句话说,我将如何获得'用户',所以我可以做'Parcels.wrap(user)'? – user5314557

+0

需要从适配器启动活动,请参阅更新。 – mbmc

+0

不好意思,如果你从onBindViewHolder启动活动,你将启动很多活动,并且不点击...将onClickListener附加到视图的视图并从那里启动。 –

4

User类像User implements Serializableimplements Serializable

通经Bundle

User userItem = mDataset.get(position); 

Intent yourIntent = new Intent(this, YourNextActivity.class); 
Bundle b = new Bundle(); 
b.putSerializable("user", userItem); 
yourIntent.putExtras(b); //pass bundle to your intent 
startActivity(yourIntent); 

序列化类,并得到

Intent i = getIntent(); 
Bundle bundle = i.getExtras(); 
User user = (User) bundle.getSerializable("user"); 
相关问题