![](/img/trans.png)
[英]How to pass a list of objects from one activity to another using parcelable
[英]Pass Object implementing Parcelable from one Activity to Another Activity
我已經審查了關於SO的類似問題,但未達到要求的結果
我正在從電影數據庫服務器中提取數據,正在使用Jackson解析該數據,並創建了一個我需要在其中實現可打包的對象,就像我在活動中一樣,我想將這些對象的列表添加到捆綁中onSaveInstanceState方法。
import android.os.Parcel;
import android.os.Parcelable;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.List;
public class Movie implements Parcelable{
@JsonProperty("adult")
private Boolean adult;
@JsonProperty("backdrop_path")
private String backdropPath;
@JsonProperty("genre_ids")
private List<Integer> genreIds = new ArrayList<Integer>();
@JsonProperty("id")
private Integer id;
@JsonProperty("original_language")
private String originalLanguage;
@JsonProperty("original_title")
private String originalTitle;
@JsonProperty("overview")
private String overview;
@JsonProperty("release_date")
private String releaseDate;
@JsonProperty("poster_path")
private String posterPath;
@JsonProperty("popularity")
private Double popularity;
@JsonProperty("title")
private String title;
@JsonProperty("video")
private Boolean video;
@JsonProperty("vote_average")
private Double voteAverage;
@JsonProperty("vote_count")
private Integer voteCount;
public Movie(){}
private Movie(Parcel in){
adult = (in.readInt() == 0) ? false : true;
backdropPath = in.readString();
genreIds = in.readArrayList(List.class.getClassLoader());
id = in.readInt();
originalLanguage = in.readString();
originalTitle = in.readString();
overview = in.readString();
releaseDate = in.readString();
posterPath = in.readString();
popularity = in.readDouble();
title = in.readString();
video = (in.readInt() == 0) ? false : true;
voteAverage = in.readDouble();
voteCount = in.readInt();
}
/**
*
* @return
* The adult
*/
@JsonProperty("adult")
public Boolean getAdult() {return adult;}
/**
*
* @param adult
* The adult
*/
@JsonProperty("adult")
public void setAdult(Boolean adult) {this.adult = adult;}
/**
*
* @return
* The backdropPath
*/
@JsonProperty("backdrop_path")
public String getBackdropPath() {return backdropPath;}
/**
*
* @param backdropPath
* The backdrop_path
*/
@JsonProperty("backdrop_path")
public void setBackdropPath(String backdropPath) {this.backdropPath = backdropPath;}
/**
*
* @return
* The genreIds
*/
@JsonProperty("genre_ids")
public List<Integer> getGenreIds() {return genreIds;}
/**
*
* @param genreIds
* The genre_ids
*/
@JsonProperty("genre_ids")
public void setGenreIds(List<Integer> genreIds) {this.genreIds = genreIds;}
/**
*
* @return
* The id
*/
@JsonProperty("id")
public Integer getId() {return id;}
/**
*
* @param id
* The id
*/
@JsonProperty("id")
public void setId(Integer id) {this.id = id;}
/**
*
* @return
* The originalLanguage
*/
@JsonProperty("original_language")
public String getOriginalLanguage() {return originalLanguage;}
/**
*
* @param originalLanguage
* The original_language
*/
@JsonProperty("original_language")
public void setOriginalLanguage(String originalLanguage) {this.originalLanguage = originalLanguage;}
/**
*
* @return
* The originalTitle
*/
@JsonProperty("original_title")
public String getOriginalTitle() {return originalTitle;}
/**
*
* @param originalTitle
* The original_title
*/
@JsonProperty("original_title")
public void setOriginalTitle(String originalTitle) {this.originalTitle = originalTitle;}
/**
*
* @return
* The overview
*/
@JsonProperty("overview")
public String getOverview() {return overview;}
/**
*
* @param overview
* The overview
*/
@JsonProperty("overview")
public void setOverview(String overview) {this.overview = overview;}
/**
*
* @return
* The releaseDate
*/
@JsonProperty("release_date")
public String getReleaseDate() {return releaseDate;}
/**
*
* @param releaseDate
* The release_date
*/
@JsonProperty("release_date")
public void setReleaseDate(String releaseDate) {this.releaseDate = releaseDate;}
/**
*
* @return
* The posterPath
*/
@JsonProperty("poster_path")
public String getPosterPath() {return posterPath;}
/**
*
* @param posterPath
* The poster_path
*/
@JsonProperty("poster_path")
public void setPosterPath(String posterPath) {this.posterPath = posterPath;}
/**
*
* @return
* The popularity
*/
@JsonProperty("popularity")
public Double getPopularity() {return popularity;}
/**
*
* @param popularity
* The popularity
*/
@JsonProperty("popularity")
public void setPopularity(Double popularity) {this.popularity = popularity;}
/**
*
* @return
* The title
*/
@JsonProperty("title")
public String getTitle() {return title;}
/**
*
* @param title
* The title
*/
@JsonProperty("title")
public void setTitle(String title) {this.title = title;}
/**
*
* @return
* The video
*/
@JsonProperty("video")
public Boolean getVideo() {
return video;
}
/**
*
* @param video
* The video
*/
@JsonProperty("video")
public void setVideo(Boolean video) {this.video = video;}
/**
*
* @return
* The voteAverage
*/
@JsonProperty("vote_average")
public Double getVoteAverage() {return voteAverage;}
/**
*
* @param voteAverage
* The vote_average
*/
@JsonProperty("vote_average")
public void setVoteAverage(Double voteAverage) {this.voteAverage = voteAverage;}
/**
*
* @return
* The voteCount
*/
@JsonProperty("vote_count")
public Integer getVoteCount() {return voteCount;}
/**
*
* @param voteCount
* The vote_count
*/
@JsonProperty("vote_count")
public void setVoteCount(Integer voteCount) {this.voteCount = voteCount;}
/**
*
* @param genreIds takes list of genre Ids
* @return list of String Genres
*/
public ArrayList<String> getGenres(List<Integer> genreIds){
ArrayList<String> genres = new ArrayList<>();
for(int genreId :genreIds) {
switch (genreId) {
case 28:
genres.add("Action");
break;
case 12:
genres.add("Adventure");
break;
case 16:
genres.add("Animation");
break;
case 35:
genres.add("Comedy");
break;
case 80:
genres.add("Crime");
break;
case 99:
genres.add("Documentary");
break;
case 18:
genres.add("Drama");
break;
case 10751:
genres.add("Family");
break;
case 14:
genres.add("Fantasy");
break;
case 10796:
genres.add("Foreign");
break;
case 36:
genres.add("History");
break;
case 27:
genres.add("Horror");
break;
case 10402:
genres.add("Music");
break;
case 9648:
genres.add("Mystery");
break;
case 10747:
genres.add("Animation");
break;
case 878:
genres.add("Science Fiction");
break;
case 10770:
genres.add("TV Movie");
break;
case 53:
genres.add("Thriller");
break;
case 10752:
genres.add("War");
break;
case 37:
genres.add("Western");
break;
default:
break;
}
}
return genres;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(adult ? 1 : 0);
dest.writeString(backdropPath);
dest.writeList(genreIds);
dest.writeInt(id);
dest.writeString(originalLanguage);
dest.writeString(originalTitle);
dest.writeString(overview);
dest.writeString(releaseDate);
dest.writeString(posterPath);
dest.writeDouble(popularity);
dest.writeString(title);
dest.writeInt(video ? 1 : 0);
dest.writeDouble(voteAverage);
dest.writeInt(voteCount);
}
public static final Parcelable.Creator<Movie> CREATOR = new Parcelable.ClassLoaderCreator<Movie>() {
@Override
public Movie createFromParcel(Parcel source) {
return new Movie(source);
}
@Override
public Movie[] newArray(int size) {
return new Movie[size];
}
@Override
public Movie createFromParcel(Parcel source, ClassLoader loader) {
return null;
}
};
}
我正在填充這些對象的RecyclerView
。 當我單擊RecyclerView項時,我想通過意圖將該對象傳遞給另一個活動。 但是我一直得到一個空指針。
這是我在onClick
上將包裹添加到意圖中的地方
@Override
public void onClick(View v) {
Log.i("POSITION: ", String.valueOf(getAdapterPosition()));
Movie movie = mMovieList.get(getAdapterPosition());
Intent detail = new Intent(mContext, MovieDetailActivity.class);
//Bundle bundle = new Bundle();
//bundle.putParcelable("movie_object", movie);
detail.putExtra("movie_object", movie);
// detail.putExtras(bundle);
mContext.startActivity(detail);
}
帶注釋的行是我的嘗試。
我在MovieDetailActivity中嘗試訪問該對象的位置:
Intent i = getIntent();
Movie movie = i.getParcelableExtra("movie_object"); <--Null
我已經實現了可序列化,並且運行良好,但是,現在我想使用需要可打包的onSavedInstanceState方法。
我不知道怎么了 誰能看到錯誤?
試試這個:第一個活動通過意圖直接通過mMovieList:
Intent detail = new Intent(mContext, MovieDetailActivity.class);
intent.putParcelableArrayListExtra("movie_object", mMovieList);
mContext.startActivity(detail);
在第二個活動中獲取電影列表
List<Movie> mMovieList = new ArrayList<Movie>;
Bundle bundle = getIntent().getExtras();
mMovieList = bundle.getParcelableArrayList("movie_object");
從列表中獲取電影對象
您可以在此處傳遞模型或mMovieList
Intent detail = new Intent(mContext, MovieDetailActivity.class);
intent.putParcelableArrayListExtra("movie_object", mMovieList);
startActivity(detail);
在另一項活動中,您可以像這樣獲得它
Bundle bundle = getIntent().getExtras();
ArrayList<mMovieList> mList=bundle.getParcelableArrayList("movie_object");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.