23

受け入れられたソリューションを反映するようにコードが変更されました。

これは、カスタム ArrayList を DialogFragment に渡す方法の実例として機能します。

newInstance の Bundle を使用して、カスタム オブジェクトの ArrayList を DialogFragment に渡しています。arraylist は newInstance で正しく受信されます。putParcelable の呼び出しは正常に実行されますが (エラーは発生しません)、ArrayList オブジェクトのパーセル可能なコードにブレークポイントを配置すると、データの設定または取得時にパーセル メソッドが呼び出されていないことがわかります。

ArrayList の LocalityList クラスを作成してそれをパーセル可能にするのは正しいですか、それとも Locality クラス自体をパーセル可能にする必要がありますか?

ダイアログフラグメント

/**
 * 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);
    }
}
4

3 に答える 3

9

この質問はかなり古いことを知っていますが、私はもともと答えを求めてここに来たので、私の経験を共有したいと思いました.

はい、クラスに Parcelable を実装する必要がありますLocalityが、それだけです。

ArrayList のラッパーのみである場合LocalityListは、必要ありません。

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 を実装することができます。

于 2014-09-14T16:09:19.080 に答える
7

はい、Localityクラス自体をParcelableにし、初期化を忘れないでください

ArrayList<Locality> mList= new ArrayList<Locality>();
于 2012-06-08T17:10:07.283 に答える
-1

私が通常使用するトリックは、Gson(Googleから)を使用してリストをJsonに解析することです。反対側では、Json の文字列を新しいリストに分割するだけです。

遅れに気づいたことはありません。

于 2012-12-26T22:58:25.740 に答える