2017-07-25 92 views
1

我通過意圖將電影對象的ArrayList從MainActivity傳遞到DetailActivity無法通過意向附加組件傳遞對象數組

intent.putExtra(KEY_mFavoriteMovies, mFavoriteMovies); 
startActivity(intent); 

在這個其他活動中,我添加了額外的電影對象。

mFavoriteMovies(movie); 

然而,mFavoriteMoviesMainActivity似乎並沒有包含其他影片對象。

預計這種行爲?

+0

你不能簡單地傳遞對象,你需要讓你的對象類實現Parcelable,然後如果你傳遞一個對象,使用putExtra,並且如果你傳遞數組,請使用putParcelableArrayListExtra – MoGa

+0

@the_prole - 你有機會檢查我的解決方案(電影名稱爲字符串或一個對象/類)?如果它工作,請接受答案並投票。謝謝! – JRG

+0

@JRG你沒有真正回答這個問題。我通過一個意圖傳遞數組列表。答案是否定的,數組列表不是相同的對象。傳遞的數組列表正在從宗地重建,並且是一個全新的對象。謝謝你嘗試。 –

回答

0

這是因爲當你在DetailActivity修改數組列表,你與你的電影列表的不同實例工作的預期行爲。

,你可以得到您對列表中的變化通過啓動DetailActivitystartActivityForResult,然後發回更新列表您MainActivity

您將有這樣的事情在你MainActivity

ArrayList<String> mMovies; 
int DETAIL_REQUEST_CODE = 123; 
String KEY_FAVORITE_MOVIES = "key-movies"; 

private void startDetailActivity() { 
    Intent intent = new Intent(this, DetailActivity.class); 
    intent.putStringArrayListExtra(KEY_FAVORITE_MOVIES, mMovies); 
    startActivityForResult(intent, DETAIL_REQUEST_CODE); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == DETAIL_REQUEST_CODE && resultCode == RESULT_OK) { 
     mMovies = data.getStringArrayListExtra(KEY_FAVORITE_MOVIES); 
    } 
} 

而且你將不得不從DetailActivity像這樣的東西發送更新列表:

public void finishDetail() { 
    Intent resultIntent = new Intent(); 
    resultIntent.putStringArrayListExtra(KEY_FAVORITE_MOVIES, mMovies); 
    setResult(Activity.RESULT_OK, resultIntent); 
    finish(); 
} 
0

方法取決於什麼是電影列表...

  • 如果你的電影列表是一個簡單的字符串的ArrayList然後使用 putStringArrayListExtragetStringArrayListExtra
  • 如果它們是對象(單獨的類),那麼你應該實現 Parcelable和使用putParcelableArrayListExtragetParcelableArrayList

如果電影名稱是那麼的對象/類實現Parcelable

import android.os.Parcel; 
import android.os.Parcelable; 

public class MovieName implements Parcelable { 

    private String name; 

    private String year; 

    public MovieName(String name, String year) { 
     this.name = name; 
     this.year = year; 
    } 

    public MovieName(Parcel in) { 
     name = in.readString(); 
     year = in.readString(); 
    } 

    // Creator 
    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
     public MovieName createFromParcel(Parcel in) { 
      return new MovieName(in); 
     } 

     public MovieName[] newArray(int size) { 
      return new MovieName[size]; 
     } 
    }; 

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

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
     parcel.writeString(name); 
     parcel.writeString(year); 
    } 

    @Override 
    public String toString() { 
     return "MovieName=[name=" + name + ";year=" + year + "]"; 
    } 
} 

裏面MainActivity當你即將startActivityDetailActivity

Intent intent = new Intent(view.getContext(), DetailActivity.class); 

ArrayList<String> movieNames = new ArrayList<String>(); 
movieNames.add("Star Wars"); 
movieNames.add("Transporter"); 
movieNames.add("Need for Speed"); 
intent.putStringArrayListExtra("MOVIE_NAMES", movieNames); 
Log.d("Movie Names", "Writing into intent ... " + movieNames.toString()); 

ArrayList<MovieName> movieNameList = new ArrayList<MovieName>(); 
movieNameList.add(new MovieName("Star Wars", "1900")); 
movieNameList.add(new MovieName("Transporter", "2000")); 
intent.putParcelableArrayListExtra("movie", movieNameList); 
Log.d("MovieName Parcelable", "Writing into intent ... " + movieNameList.toString()); 

startActivity(intent); 

DetailActivity's onCreate

ArrayList<String> movieNames = getIntent().getStringArrayListExtra("MOVIE_NAMES"); 
Log.d("Movie Names", "Reading from intent ... " + movieNames.toString()); 

ArrayList<MovieName> movieNameList = getIntent().getExtras().getParcelableArrayList("movie"); 
Log.d("MovieName Parcelable", "Reading from intent ... " + movieNameList.toString()); 

樣品試驗

07-25 16:32:53.108 5264-5264/? D/Movie Names: Writing into intent ... [Star Wars, Transporter, Need for Speed] 
07-25 16:32:53.111 5264-5264/? D/MovieName Parcelable: Writing into intent ... [MovieName=[name=Star Wars;year=1900], MovieName=[name=Transporter;year=2000]] 

07-25 16:32:53.144 5264-5264/? D/Movie Names: Reading from intent ... [Star Wars, Transporter, Need for Speed] 
07-25 16:32:53.145 5264-5264/? D/MovieName Parcelable: Reading from intent ... [MovieName=[name=Star Wars;year=1900], MovieName=[name=Transporter;year=2000]] 
0

此外,以@JRG答案以獲得更新的MainActivity您需要啓動DetailActivitystartActivityForResult列表。這將爲您提供一個選項,使用setResultDetailsActivity更新的數組返回到MainActivityonActivityResult回調。

另一種方法是通過從模型(最喜歡的電影)中分離視圖部分(活動)來更改應用程序的體系結構來修復它。