簡體   English   中英

傳遞ArrayList<? implements Parcelable> 活動

[英]Pass ArrayList<? implements Parcelable> to Activity

我搜索了一些主題,但沒有找到解決我的問題的方法。

public class Series implements Parcelable {
private String name;
private int numOfSeason;
private int numOfEpisode;

/** Constructors and Getters/Setters have been removed to make reading easier **/

public Series(Parcel in) {
    String[] data = new String[3];
    in.readStringArray(data);
    this.name = data[0];
    this.numOfSeason = Integer.parseInt(data[1]);
    this.numOfEpisode = Integer.parseInt(data[2]);
}


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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeStringArray(new String[] { this.name,
            String.valueOf(this.numOfSeason),
            String.valueOf(this.numOfEpisode) });

}

private void readFromParcel(Parcel in) {
    name = in.readString();
    numOfSeason = in.readInt();
    numOfEpisode = in.readInt();
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    @Override
    public Series createFromParcel(Parcel in) {
        return new Series(in);
    }

    @Override
    public Series[] newArray(int size) {
        return new Series[size];
    }
};

}

在我的 MainActivity 中,我有一個 ArrayList。 為了使列表可動態編輯,我需要將它傳遞給另一個我可以編輯它的活動。

ArrayList<Series> listOfSeries = new ArrayList<Series>();

    public void openAddActivity() {
    Intent intent = new Intent(this, AddActivity.class);
    intent.putParcelableArrayListExtra(
            "com.example.episodetracker.listofseries",
            (ArrayList<? extends Parcelable>) listOfSeries);
    startActivity(intent);
}

我需要轉換列表,否則 Eclipse 會給我以下錯誤消息。 Intent 類型中的 putParcelableArrayListExtra(String, ArrayList) 方法不適用於參數 (String, List)

這是正確的方法嗎?

    ArrayList<Series> list = savedInstanceState
            .getParcelableArrayList("com.example.episodetracker.listofseries");

這是我嘗試在另一個活動中讀取數據的方式。

它在上面的線上崩潰。 即 getParcelableArrayList 部分。

  • 問題在於寫出包裹並從包裹中讀取......

     @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(numOfSeason); dest.writeInt(numOfEpisode); } private void readFromParcel(Parcel in) { name = in.readString(); numOfSeason = in.readInt(); numOfEpisode = in.readInt(); }
  • 你寫出來的東西必須和你讀到的東西相匹配……

     @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent i = new Intent(this,SecondActivity.class); ArrayList<testparcel> testing = new ArrayList<testparcel>(); i.putParcelableArrayListExtra("extraextra", testing); startActivity(i); } /**********************************************/ public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<testparcel> testing = this.getIntent().getParcelableArrayListExtra("extraextra"); } }
  • 上面的代碼有來自兩個不同活動的 onCreate()。 第一個啟動第二個; 並且它工作正常我能夠毫無問題地拉出parcelable。

您應該在Intent類上使用putParcelableArrayListExtra()方法。

我已經使用了Bundle對象中的putParcelableArrayList(<? extends Parcelable>) 不是直接來自意圖對象。(我真的不知道有什么區別)。 但我習慣以這種方式使用:

ArrayList<ParcelableRow> resultSet = new ArrayList<ParcelableRow>();
resultSet = loadData();

Bundle data = new Bundle();
data.putParcelableArrayList("search.resultSet", resultSet);
yourIntent.putExtra("result.content", data);
startActivity(yourIntent);

稍后在您的新活動中,您可以填充最近插入 Bundle 對象的數據,如下所示:

Bundle data = this.getIntent().getBundleExtra("result.content");
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset");

請記住,您的ArrayList<>必須僅包含可分割的對象。 並且只是為了確保您已經通過了數據,您可以檢查收到的數據是否為空,以避免出現問題。

也許這對某人有幫助……否則我的問題是我使用了 write 和 readValue 但它應該匹配 writeInt、readInt writeString、readString 等類型

我是這樣做的:

var intent = Intent(this@McqActivity,ResultActivity::class.java)
intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList)) 
// resultList  is of type mutableListOf<ResultBO>()  
 startActivity(intent)

並用於制作Parcelable 類 我簡單地做two operation起初我用@Parcelize Annotation我上面的數據類,其次我繼承它Parcelable像下面..

import kotlinx.android.parcel.Parcelize
import android.os.Parcelable

@Parcelize // Include Annotion 
data class ResultBO(val questionBO: QuestionBO) : Parcelable {
    constructor() : this(QuestionBO())
}

並在接收端

if (intent != null) {
     var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
}

您可以通過 Parcelable ArrayList

發件人活動 ->

startActivity(Intent(this, SenderActivity::class.java).apply { putExtra("getList",list)})

接收器活動 ->

private lateinit var list: ArrayList<List>

list = this.intent.extras?.getParcelableArrayList("getList")!!

您將獲得列表中的所有 Arraylist。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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