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"); 
相關問題