Android 安卓ArrayList<;MyObject>;作为包裹通行证

Android 安卓ArrayList<;MyObject>;作为包裹通行证,android,parameters,parcelable,Android,Parameters,Parcelable,现在修改代码以反映已接受的解决方案。 这是一个如何将自定义ArrayList传递到DialogFragment中的工作示例。 我使用newInstance上的捆绑包将自定义对象的ArrayList传递给DialogFragment。 在newInstance中正确接收arraylist。对putParcelable的调用执行得很好(没有错误),但是在ArrayList对象的parcelable代码中放置断点表明在设置或获取数据时没有调用parcel方法 我是否正确地为ArrayList创建Loc

现在修改代码以反映已接受的解决方案。

这是一个如何将自定义ArrayList传递到DialogFragment中的工作示例。

我使用newInstance上的捆绑包将自定义对象的ArrayList传递给DialogFragment。 在newInstance中正确接收arraylist。对putParcelable的调用执行得很好(没有错误),但是在ArrayList对象的parcelable代码中放置断点表明在设置或获取数据时没有调用parcel方法

我是否正确地为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;
}
LocationList类

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 java.util.ArrayList;
导入android.os.packet;
导入android.os.Parcelable;
公共类LocalityList扩展ArrayList实现了Parcelable{
私有静态最终长serialVersionUID=663585476779879096L;
公共场所列表(){
}
@抑制警告(“未使用”)
公共地点列表(地块所在地){
这个();
从包裹中读取;
}
private void readFromParcel(地块位于中){
这个.clear();
//首先,我们必须阅读列表大小
int size=in.readInt();
对于(int i=0;i
局部类

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);
    }
}
导入android.os.packet;
导入android.os.Parcelable;
公共类局部性实现了Parcelable{
私有字符串描述;
私人双重国籍;
私人双重身份;
公共位置(字符串描述、双纬度、双经度){
超级();
this.mddescription=说明;
这个。纬度=纬度;
this.m长=经度;
}
公共场所(){
超级();
}
公共字符串getDescription(){
返回mDescription;
}
公共void集合描述(字符串描述){
this.mddescription=说明;
}
公共双纬度(){
返回时间;
}
公共纬度(双纬度){
这个。纬度=纬度;
}
公共双getLongitude(){
返回长度;
}
公共经度(双经度){
this.m长=经度;
}
@抑制警告(“未使用”)
公共场所(地块内){
这个();
从包裹中读取;
}
private void readFromParcel(地块位于中){
this.mddescription=in.readString();
this.mLatitude=in.readDouble();
this.mLongitude=in.readDouble();
}
公共int描述内容(){
返回0;
}
public final Parcelable.Creator=新Parcelable.Creator(){
公共地点createFromParcel(地块位于){
返回新位置(在中);
}
公共位置[]新数组(整数大小){
返回新的位置[大小];
}
};
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的书面记录(mDescription);
目的地可写性(mLatitude);
目标可写双倍(m长度);
}
}

是的,使
局部性
类本身可以打包,并且不要忘记初始化

ArrayList mList=new ArrayList();

我通常使用的技巧是使用Gson(来自谷歌)将列表解析为Json。另一方面,我只是将Json中的字符串分回到一个新列表


从未注意到任何滞后。

我知道这个问题很老了,但由于我最初来这里寻找答案,我想分享我的经验

是的,您需要为
Locality
类实现Parcelable,但仅此而已

如果您的
LocalityList
只是ArrayList的包装器,则不需要它

就用这个方法吧


因此,除非您出于其他原因需要自定义ArrayList,否则您可以避免做任何额外的工作,只为Location类实现Parcelable。

谢谢。LocalityList和Locality类都需要是可打包的,还是只需要Locality类本身。我希望我需要对ArrayList进行打包,这将序列化数组中的所有单个类。serializable适用于Java(不推荐用于Android),请始终使用parcelable。现在工作正常,如图所示。这演示了如何将自定义ArrayList传递到FragmentDialog以在ListView中显示。多了解一点信息总是好的(要演示的代码示例很小)。目前,您的答案似乎不是问题的答案。基本上这就是我通常做的。列表->JSON字符串;捆JSON字符串->列表;
ArrayList<Locality> mList= new ArrayList<Locality>();
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);