通行证的ArrayList (Pass ArrayList<? implements Par

2019-07-20 16:53发布

我已经搜索了几个话题,但没有找到一个解决我的问题。

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。 上榜的动态editeable我需要将它传递到另一个活动,我可以对其进行编辑。

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中给了我下面的错误消息。 在类型意图的方法putParcelableArrayListExtra(字符串,ArrayList的)是不适用的参数(字符串,列表)

这是做了正确的方法是什么?

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

这是我尝试在其他活动来读取数据的方式。

它上面的崩溃就行了。 即getParcelableArrayList部分。

Answer 1:

  • 问题是,在写出到包裹,并从包裹阅读...

     @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没有问题。



Answer 2:

您应该使用putParcelableArrayListExtra()的方法Intent类。



Answer 3:

我用putParcelableArrayList(<? extends Parcelable>)从一个Bundle对象。 不直接从意向性对象。(我真的不知道有什么区别)。 但我用这种方式来使用:

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<>只能包含parcelable对象。 而只是为了确保您已通过这些数据,您可以检查接收到的数据为空或不是,只是为了避免出现问题。



Answer 4:

也许这可以帮助别人..不然的话,我的问题是,我用写和readValue但它应该像writeInt,writeString的readInt,readString等匹配类型



Answer 5:

我这样做了这种方式:

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")
}


文章来源: Pass ArrayList to Activity