Pass ArrayList <? реализует 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 предоставит мне следующее сообщение об ошибке.
Метод putParcelableArrayListExtra (String, ArrayList) в типе Intent не применим для аргументов (String, List)
Правильно ли это делается?
ArrayList<Series> list = savedInstanceState
.getParcelableArrayList("com.example.episodetracker.listofseries");
Вот как я пытаюсь читать данные в другом действии.
Он падает на линию выше. а именно: getParcelableArrayList.
Ответы
Ответ 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() из двух разных действий. Первый запускает второй; и он отлично работает, я смог вытащить аргумент без проблем.
Ответ 2
Я использовал putParcelableArrayList(<? extends Parcelable>)
из объекта Bundle
. Не прямо из объекта Intent Object (я не знаю, какая разница). но я использую так:
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<>
должен содержать только доступные объекты. и просто чтобы убедиться, что вы передали данные, которые вы можете проверить, являются ли полученные данные нулевыми или нет, просто чтобы избежать проблем.
Ответ 3
Вы должны использовать метод putParcelableArrayListExtra()
в классе Intent
.
Ответ 4
Возможно, это помогает кому-то. Еще моя проблема заключалась в том, что я использовал write и readValue, но он должен соответствовать типу типа writeInt, readInt writeString, readString и т.д.