传递arraylists的arraylist

时间:2018-07-31 14:21:27

标签: java android arraylist android-activity

我知道这是一个常见问题,我在线查看了解决方案,但是我很难自行实现。

我有一个包含三个变量的类:LocationDateUri

我有一个Arraylist,它由多个包含所述类的Arraylist组成。

例如:

ArrayList<ArrayList<class>>

我正在尝试将其传递给另一项活动,但未成功。 我同时尝试了ParcelableSerializable,但是都没有。

编辑:已添加源代码。

课程文档

public class imageHolder implements Parcelable
{
private Uri uri;
private Date date;
private Location loc;

public imageHolder(Uri uriAdd, Date dateAdded,Location imgLoc)
{
    this.uri = uriAdd;
    this.date = dateAdded;
    this.loc = imgLoc;
}


public static final Creator<imageHolder> CREATOR = new Creator<imageHolder>() {
    @Override
    public imageHolder createFromParcel(Parcel in) {
        return new imageHolder(in);
    }

    @Override
    public imageHolder[] newArray(int size) {
        return new imageHolder[size];
    }
};

public Uri getURI() { return this.uri; }

public Date getDate() {return this.date; }

public Location getLocation() {return this.loc; };

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeSerializable(date);
    parcel.writeParcelable(uri,i);
    parcel.writeParcelable(loc, i);
}

protected imageHolder(Parcel in) {
    date = (java.util.Date) in.readSerializable();
    uri = in.readParcelable(Uri.class.getClassLoader());
    loc = in.readParcelable(Location.class.getClassLoader());
}

}

第一个活动:

ArrayList<ArrayList<imageHolder>> sepImages = new ArrayList<ArrayList<imageHolder>>();
    sepImages = groupPics(images);


    Intent nextActivity = new Intent(loadImages.this, storiesScreen.class);
    nextActivity.putExtra("images",images);
    startActivity(nextActivity);
    finishActivity(0);

第二活动:

ArrayList<ArrayList<imageHolder>> sepImages = 
(ArrayList<ArrayList<imageHolder>>) getIntent().getParcelableExtra("images");
Log.d("stories","test");

3 个答案:

答案 0 :(得分:0)

我认为您也可以使用Gson。

在您的 build.gradle

implementation 'com.google.code.gson:gson:2.8.4'

第一项活动

Gson gson = new Gson();
String json = gson.toJson(yourObject);
intent.putExtra("yourKey", json);

第二项活动

Gson gson = new Gson();
YourObject yourObject = gson.fromJson(getIntent().getStringExtra("yourKey"), YourObject.class);

简单快捷。

答案 1 :(得分:0)

我认为最好的做法是创建一个实现Parcelable的新类,并在活动之间传递该新类的实例。

public class ParcelableListOfLists implements Parcelable {

    private ArrayList<ArrayList<imageHolder>> listOfLists;

    public ParcelableListOfLists(ArrayList<ArrayList<imageHolder>> listOfLists) {
        this.listOfLists = listOfLists;
    }

    public ArrayList<ArrayList<imageHolder>> getListOfLists() {
        return listOfLists;
    }

    // parcelable implementation here
}

有了此类后,您就可以完全控制数据的打包方式,这使您可以执行某些操作,而这些操作是使用内置Android系统无法完成的,在产品中。

这是打包列表清单的一种方法:

@Override
public void writeToParcel(Parcel dest, int flags) {
    if (listOfLists != null) {
        dest.writeInt(listOfLists.size());

        for (ArrayList<imageHolder> list : listOfLists) {
            dest.writeTypedList(list);
        }
    } else {
        dest.writeInt(-1);
    }
}

另一方面,您可以像这样重新创建列表列表:

public ParcelableListOfLists(Parcel in) {
    int size = in.readInt();

    if (size != -1) {
        this.listOfLists = new ArrayList<>(size);

        for (int i = 0; i < size; ++i) {
            ArrayList<imageHolder> list = in.createTypedArrayList(imageHolder.CREATOR);
            listOfLists.add(list);
        }
    } else {
        this.listOfLists = null;
    }
}

结合所有这些,您可以像这样在活动之间传递列表清单:

Intent nextActivity = new Intent(loadImages.this, storiesScreen.class);
nextActivity.putExtra("images", new ParcelableListOfLists(images));
startActivity(nextActivity);

并在下一个活动中像这样检索它们:

ParcelableListOfLists plol = getIntent().getParcelableExtra("images");
ArrayList<ArrayList<imageHolder>> images = plol.getListOfLists();

答案 2 :(得分:0)

好的。

您的型号

public class ImageHolder implements Serializable {

    // Use String here, to avoid serialization problems
    private String uri;
    private Date date;
    private Location loc;

    public ImageHolder() {
    }

    public ImageHolder(String uri, Date date, Location loc) {
        this.uri = uri;
        this.date = date;
        this.loc = loc;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Location getLoc() {
        return loc;
    }

    public void setLoc(Location loc) {
        this.loc = loc;
    }

    @Override
    public String toString() {
        return "ImageHolder{" +
                "uri=" + uri +
                ", date=" + date +
                ", loc=" + loc +
                '}';
    }
}

创建一个容器

public class Container implements Serializable {

    private ArrayList<ImageHolder> list;

    public Container() {
    }

    public Container(ArrayList<ImageHolder> list) {
        this.list = list;
    }

    public ArrayList<ImageHolder> getList() {
        return list;
    }

    public void setList(ArrayList<ImageHolder> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        return "Container{" +
                "list=" + list +
                '}';
    }
}

您的首次活动

public class MainActivity extends AppCompatActivity {

    public static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }

    @Override
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        ImageHolder imageHolder0 = new ImageHolder("http://www.stackoverflow.com", new Date(), new Location("test0"));
        ImageHolder imageHolder1 = new ImageHolder("http://www.google.com", new Date(), new Location("test1"));

        ArrayList<ImageHolder> list = new ArrayList<>();
        list.add(imageHolder0);
        list.add(imageHolder1);

        Container container = new Container(list);

        Gson gson = new Gson();
        String json = gson.toJson(container);

        Intent intent = new Intent(MainActivity.this, TestActivity.class);
        intent.putExtra("yourKey", json);

        startActivity(intent);
    }
}

您的第二次活动

public class TestActivity extends AppCompatActivity {
    public static final String TAG = TestActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onPostCreate(@Nullable Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        Gson gson = new Gson();
        Container container = gson.fromJson(getIntent().getStringExtra("yourKey"), Container.class);

        Log.d(TAG, "OK?" + container.getList().toString());

        // Here convert String uri Fields to Uri Objects
        // Example:
        Uri uri = Uri.parse(container.getList().get(0).getUri());
    }
}


Logcat结果:08-01 11:10:22.097 6671-6671/it.darksurfer.english.template D/TestActivity: OK?[ImageHolder{uri=http://www.stackoverflow.com, date=Wed Aug 01 11:10:21 GMT+02:00 2018, loc=Location[test0 0,000000,0,000000 acc=??? t=?!? et=?!?]}, ImageHolder{uri=http://www.google.com, date=Wed Aug 01 11:10:21 GMT+02:00 2018, loc=Location[test1 0,000000,0,000000 acc=??? t=?!? et=?!?]}]



很明显,您可以在Container类的列表中放置未定义数量的其他ArrayList!