承認されたソリューションを反映するようにコードが変更されました。
これは、カスタムArrayListをDialogFragmentに渡す方法の実際の例として機能します。
NewInstanceのバンドルを使用して、カスタムオブジェクトのArrayListをDialogFragmentに渡します。 arraylistはnewInstanceで正しく受信されます。 putParcelableの呼び出しは正常に実行されますが(エラーはありません)、ArrayListオブジェクトのパーセル可能なコードにブレークポイントを設定すると、データの設定または取得時にパーセルメソッドが呼び出されないことが示されます。
ArrayListのLocalityListクラスを作成してパーセル可能にするのは正しいですか、それともLocalityクラス自体をパーセル可能にする必要がありますか?
DialogFragment
/**
* Create a new instance of ValidateUserEnteredLocationLocalitySelectorFragment, providing "localityList"
* as an argument.
*/
public static ValidateUserEnteredLocationLocalitySelectorFragment newInstance(LocalityList localityList) {
ValidateUserEnteredLocationLocalitySelectorFragment fragmentInstance = new ValidateUserEnteredLocationLocalitySelectorFragment();
// Supply location input as an argument.
Bundle bundle = new Bundle();
bundle.putParcelable(KEY_LOCALITY_LIST, localityList);
fragmentInstance.setArguments(bundle);
return fragmentInstance;
}
/**
* Retrieve the locality list from the bundle
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocalityList = getArguments().getParcelable(KEY_LOCALITY_LIST);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.validate_user_entered_location, container, false);
mLocalityListView = (ListView) view.findViewById(R.id.dialogLocalityListView);
mAdapter = new SearchLocationLocalitiesListAdapter(getActivity(), mLocalityList);
mLocalityListView.setAdapter(mAdapter);
return view;
}
LocalityListクラス
import Java.util.ArrayList;
import Android.os.Parcel;
import Android.os.Parcelable;
public class LocalityList extends ArrayList<Locality> implements Parcelable {
private static final long serialVersionUID = 663585476779879096L;
public LocalityList() {
}
@SuppressWarnings("unused")
public LocalityList(Parcel in) {
this();
readFromParcel(in);
}
private void readFromParcel(Parcel in) {
this.clear();
// First we have to read the list size
int size = in.readInt();
for (int i = 0; i < size; i++) {
Locality r = new Locality(in.readString(), in.readDouble(), in.readDouble());
this.add(r);
}
}
public int describeContents() {
return 0;
}
public final Parcelable.Creator<LocalityList> CREATOR = new Parcelable.Creator<LocalityList>() {
public LocalityList createFromParcel(Parcel in) {
return new LocalityList(in);
}
public LocalityList[] newArray(int size) {
return new LocalityList[size];
}
};
public void writeToParcel(Parcel dest, int flags) {
int size = this.size();
// We have to write the list size, we need him recreating the list
dest.writeInt(size);
for (int i = 0; i < size; i++) {
Locality r = this.get(i);
dest.writeString(r.getDescription());
dest.writeDouble(r.getLatitude());
dest.writeDouble(r.getLongitude());
}
}
}
局所性クラス
import Android.os.Parcel;
import Android.os.Parcelable;
public class Locality implements Parcelable {
private String mDescription;
private double mLatitude;
private double mLongitude;
public Locality(String description, double latitude, double longitude) {
super();
this.mDescription = description;
this.mLatitude = latitude;
this.mLongitude = longitude;
}
public Locality(){
super();
}
public String getDescription() {
return mDescription;
}
public void setDescription(String description) {
this.mDescription = description;
}
public double getLatitude() {
return mLatitude;
}
public void setLatitude(double latitude) {
this.mLatitude = latitude;
}
public double getLongitude() {
return mLongitude;
}
public void setLongitude(double longitude) {
this.mLongitude = longitude;
}
@SuppressWarnings("unused")
public Locality(Parcel in) {
this();
readFromParcel(in);
}
private void readFromParcel(Parcel in) {
this.mDescription = in.readString();
this.mLatitude = in.readDouble();
this.mLongitude = in.readDouble();
}
public int describeContents() {
return 0;
}
public final Parcelable.Creator<Locality> CREATOR = new Parcelable.Creator<Locality>() {
public Locality createFromParcel(Parcel in) {
return new Locality(in);
}
public Locality[] newArray(int size) {
return new Locality[size];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mDescription);
dest.writeDouble(mLatitude);
dest.writeDouble(mLongitude);
}
}
はい、Locality
クラス自体を作成Parcelable、そしてinitializeを忘れないでください
ArrayList<Locality> mList= new ArrayList<Locality>();
この質問はかなり古いですが、私はもともと答えを求めてここに来たので、自分の経験を共有したいと思いました。
はい、Locality
クラスにParcelableを実装する必要がありますが、それだけです。
LocalityList
がArrayListのラッパーのみである場合、それは必要ありません。
putParcelableArrayList メソッドを使用するだけです。
ArrayList<Locality> localities = new ArrayList<Locality>;
...
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_LOCALITY_LIST, localities);
fragmentInstance.setArguments(bundle);
return fragmentInstance;
そして、それを使用してそれを取得します...
localities = savedInstanceState.getParcelableArrayList(KEY_LOCALITY_LIST);
したがって、他の何らかの理由でカスタムArrayListが必要でない限り、そのような余分な作業を行わずに、LocalityクラスにParcelableのみを実装できます。