簡體   English   中英

將實現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");

從列表中獲取電影對象

否則嘗試此鏈接https://stackoverflow.com/a/10114932/5202007

您可以在此處傳遞模型或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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM