如何将 List<Model> 从 Activity 传递到 Fragment

Posted

技术标签:

【中文标题】如何将 List<Model> 从 Activity 传递到 Fragment【英文标题】:How can I pass List<Model> from Activity to Fragment 【发布时间】:2018-11-20 12:49:59 【问题描述】:

我想将列表从活动传递到片段。但我不知道模型类必须实现“Parcelable”或“Serializable”。还有如何定义实现方法。感谢您看到这个问题。在代码下是我的模型类。

 public class Artist 

private String artistName;
private String aritstImgPath;
private List<Album> albumList;

public Artist() 



public Artist(String artistName, String aritstImgPath, List<Album> albumList) 
    this.artistName = artistName;
    this.aritstImgPath = aritstImgPath;
    this.albumList = albumList;



public String getArtistName() 
    return artistName;


public void setArtistName(String artistName) 
    this.artistName = artistName;


public String getAritstImgPath() 
    return aritstImgPath;


public void setAritstImgPath(String aritstImgPath) 
    this.aritstImgPath = aritstImgPath;


public List<Album> getAlbumList() 
    return albumList;


public void setAlbumList(List<Album> albumList) 
    this.albumList = albumList;


@Override
public String toString() 
    return "Artist" +
            "artistName='" + artistName + '\'' +
            ", aritstImgPath='" + aritstImgPath + '\'' +
            ", albumList=" + albumList +
            '';




public class Album 
private String albumTitle;
private String albumImgPath;
private List<Song> songList;

public Album() 


public Album(String albumTitle, String albumImgPath, List<Song> songList) 
    this.albumTitle = albumTitle;
    this.albumImgPath = albumImgPath;
    this.songList = songList;


public String getAlbumTitle() 
    return albumTitle;


public void setAlbumTitle(String albumTitle) 
    this.albumTitle = albumTitle;


public String getAlbumImgPath() 
    return albumImgPath;


public void setAlbumImgPath(String albumImgPath) 
    this.albumImgPath = albumImgPath;


public List<Song> getSongList() 
    return songList;


public void setSongList(List<Song> songList) 
    this.songList = songList;


@Override
public String toString() 
    return "Album" +
            "albumTitle='" + albumTitle + '\'' +
            ", albumImgPath='" + albumImgPath + '\'' +
            ", songList=" + songList +
            '';



public class Song 
private String songTitle;
private String playTime;
private String assPath;
private String ampPath;

public Song() 


public Song(String songTitle, String playTime, String assPath, String ampPath) 
    this.songTitle = songTitle;
    this.playTime = playTime;
    this.assPath = assPath;
    this.ampPath = ampPath;


public String getSongTitle() 
    return songTitle;


public void setSongTitle(String songTitle) 
    this.songTitle = songTitle;


public String getPlayTime() 
    return playTime;


public void setPlayTime(String playTime) 
    this.playTime = playTime;


public String getAssPath() 
    return assPath;


public void setAssPath(String assPath) 
    this.assPath = assPath;


public String getAmpPath() 
    return ampPath;


public void setAmpPath(String ampPath) 
    this.ampPath = ampPath;


@Override
public String toString() 
    return "Song" +
            "songTitle='" + songTitle + '\'' +
            ", playTime='" + playTime + '\'' +
            ", assPath='" + assPath + '\'' +
            ", ampPath='" + ampPath + '\'' +
            '';


    我是否必须在我的所有 Model 类中实现 parcelable 或 serializable?

    当我制作捆绑包时,正确的方法是什么? (putSerializable?putParcelable?)

    如何获取片段中的列表。

【问题讨论】:

1-使您的模型可序列化或 Parcelable 任何您想要的。 2- 使用您在片段中使用的可序列化或 Parcelable 获取列表。 how to pass List<NameOfClassObject> from activity to fragment的可能重复 【参考方案1】:

您可以在模型类中实现 parcelable。

public class ModelClass implements Parcelable 

        public ModelClass(Parcel in) 
            super(); 
            readFromParcel(in);
        

        public static final Parcelable.Creator<ModelClass> CREATOR = new Parcelable.Creator<ModelClass>() 
            public ModelClass createFromParcel(Parcel in) 
                return new ModelClass (in);
            

            public ModelClass [] newArray(int size) 

                return new ModelClass [size];
            

        ;

        public void readFromParcel(Parcel in) 
          Value1 = in.readInt();
          Value2 = in.readInt();
          Value3 = in.readInt();

        
        public int describeContents() 
            return 0;
        

        public void writeToParcel(Parcel dest, int flags) 
            dest.writeInt(Value1);
            dest.writeInt(Value2);  
            dest.writeInt(Value3);
       
    

将对象发送到片段。

ArrayList<ModelClass> arraylist = new Arraylist<>();  
Bundle bundle = new Bundle();  
bundle.putParcelableArrayList("arraylist", arraylist);

从片段接收​​对象

Bundle extras = getIntent().getExtras();  
ArrayList<ModelClass> arraylist  = extras.getParcelableArrayList("arraylist");  
ModelClass model= arrayList[0];

【讨论】:

【参考方案2】:

Thers 是两种将列表从 Activity 传递到 Fragment 的方法。 1.Serializable 和 2. Parcelable

    我是否必须在我的所有 Model 类中实现 parcelable 或 serializable ? --> 是的,你必须在所有类中实现 Parcelable 或 serializable

    当我制作捆绑包时,正确的方法是什么? (putSerializable?putParcelable?) --> 如果你正在使用可序列化,那么你必须使用 putSerializable 否则 putParcelable

    如何获取片段中的列表。 -->

1.使用可序列化

发送对象列表

    Bundle bundle = new Bundle();
    bundle.putSerializable("key",arraylist);

接收对象列表

 List<Model> = (List<Model>)  getArguments().getSerializable("key);

2。使用 Parcelable

发送对象列表

Bundle bundle = new Bundle();  
bundle.putParcelableArrayList("key", arraylist);

接收对象列表

List<Model>  arraylist  = getArguments().getParcelableArrayList("arraylist"); 

【讨论】:

以上是关于如何将 List<Model> 从 Activity 传递到 Fragment的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型“System.Collections.Generic.List<model1>”隐式转换为“System.Collections.Generic.List<model2&

使用 jquery 从视图提交包含输入和 List<Model> 的表单到操作

将动态变量转换为 List<model> 或数组

jquery 中$.post获取MVC Controller中JsonResult返回包含LIst<Model>类型的子List<Model>的高级使用方法

c#如何把一list<> 复制到 另一个list<>

如何 创建一个model对象保存到LIST集合里面并取出来