Parcel // ArrayList 的问题

发布于 2024-11-14 17:06:20 字数 3829 浏览 3 评论 0原文

我目前正在尝试将对象的 ArrayList 从一个活动传递到另一个活动。经过一番搜索,我发现可以将东西作为包裹传递。这是我最终要做的:

public class PartsList extends ArrayList<Part> implements Parcelable {

public PartsList(){

}

public PartsList(Parcel in){

}

@SuppressWarnings("unchecked")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public PartsList createFromParcel(Parcel in) {
        return new PartsList(in);
    }

    public Object[] newArray(int arg0) {
        return null;
    }
};

private void readFromParcel(Parcel in) {
    this.clear();

    // read the list size
    int size = in.readInt();

    // order of the in.readString is fundamental
    // it must be ordered as it is in the Part.java file

    for (int i = 0; i < size; i++) {
        Part p = new Part();
        p.setDesc(in.readString());
        p.setItemNmbr(in.readString());
        p.setPrice(new BigDecimal(in.readString()));
        this.add(p);
    }
}


@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel arg0, int arg1) {
    int size = this.size();

    arg0.writeInt(size);

    for (int i = 0; i < size; i++) {
        Part p = this.get(i);
        arg0.writeString(p.getDesc());
        arg0.writeString(p.getItemNmbr());
        arg0.writeString(p.getPrice().toString());
    }
}
    }

这是对象部分:

public class Part implements Parcelable{
private String desc;
private String itemNmbr;
private BigDecimal price;

public Part(){

}

public Part(String i, String d, BigDecimal p){
    this.desc = d;
    this.itemNmbr = i;
    this.price = p;
}

当然它也有 getters/setters。

这是创建列表的位置:

for (String i : tempList){
        Matcher matcher = pattern.matcher(i);
        while (matcher.find()){

            // getting matches
            String desc = matcher.group(6);
            String item = matcher.group(9);
            BigDecimal price = new BigDecimal(matcher.group(12).toString());

            // adding the new part to the parts list
            parts.add(new Part(item, desc, price));
        }
    }

现在,这是接收列表的位置:

    public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // get extras (list)
  Bundle b = getIntent().getExtras();
  parts = b.getParcelable("parts");
//    Part[] PARTS = (Part[]) parts.toArray();
  final Part[] PARTS = new Part[] {
    new Part("desc", "item id", new BigDecimal(0))    
  };
  final String[] COUNTRIES = new String[] {
        "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra"
      };
  setListAdapter(new ArrayAdapter<Part>(this, R.layout.list_item, PARTS));

  ListView lv = getListView();
  lv.setTextFilterEnabled(true);

  lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
      // When clicked, show a toast with the TextView text
      Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
          Toast.LENGTH_SHORT).show();
    }
  });
}

如果我不使用包裹,而只使用数组 - 它工作正常。我注释掉了我的测试列表,它工作得很好,否则它就崩溃了。

//          parts.add(new Part("desc", "item id", new BigDecimal(0)));
//          parts.add(new Part("desc2", "item id2", new BigDecimal(1)));
//          parts.add(new Part("desc3", "item id3", new BigDecimal(2)));
        // create a new bundle
        Bundle b = new Bundle();

        // put the list into a parcel
        b.putParcelable("parts", parts);
        Intent i = new Intent(SearchActivity.this, Results.class);

        // put the bundle into the intent
        i.putExtras(b);
        startActivity(i);

我在实施包裹时做错了什么吗?我无法弄清楚这一点。如果有人能尽快帮助我——那就太棒了。

I am currently trying to pass an ArrayList of objects from one activity to another. After much searching, I saw that you could pass things as parcels. Here is what I ended up doing:

public class PartsList extends ArrayList<Part> implements Parcelable {

public PartsList(){

}

public PartsList(Parcel in){

}

@SuppressWarnings("unchecked")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public PartsList createFromParcel(Parcel in) {
        return new PartsList(in);
    }

    public Object[] newArray(int arg0) {
        return null;
    }
};

private void readFromParcel(Parcel in) {
    this.clear();

    // read the list size
    int size = in.readInt();

    // order of the in.readString is fundamental
    // it must be ordered as it is in the Part.java file

    for (int i = 0; i < size; i++) {
        Part p = new Part();
        p.setDesc(in.readString());
        p.setItemNmbr(in.readString());
        p.setPrice(new BigDecimal(in.readString()));
        this.add(p);
    }
}


@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel arg0, int arg1) {
    int size = this.size();

    arg0.writeInt(size);

    for (int i = 0; i < size; i++) {
        Part p = this.get(i);
        arg0.writeString(p.getDesc());
        arg0.writeString(p.getItemNmbr());
        arg0.writeString(p.getPrice().toString());
    }
}
    }

And here is the part Object:

public class Part implements Parcelable{
private String desc;
private String itemNmbr;
private BigDecimal price;

public Part(){

}

public Part(String i, String d, BigDecimal p){
    this.desc = d;
    this.itemNmbr = i;
    this.price = p;
}

It also has getters/setters of course.

This is where the list is created:

for (String i : tempList){
        Matcher matcher = pattern.matcher(i);
        while (matcher.find()){

            // getting matches
            String desc = matcher.group(6);
            String item = matcher.group(9);
            BigDecimal price = new BigDecimal(matcher.group(12).toString());

            // adding the new part to the parts list
            parts.add(new Part(item, desc, price));
        }
    }

Now, here is where it is received:

    public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // get extras (list)
  Bundle b = getIntent().getExtras();
  parts = b.getParcelable("parts");
//    Part[] PARTS = (Part[]) parts.toArray();
  final Part[] PARTS = new Part[] {
    new Part("desc", "item id", new BigDecimal(0))    
  };
  final String[] COUNTRIES = new String[] {
        "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra"
      };
  setListAdapter(new ArrayAdapter<Part>(this, R.layout.list_item, PARTS));

  ListView lv = getListView();
  lv.setTextFilterEnabled(true);

  lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
      // When clicked, show a toast with the TextView text
      Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
          Toast.LENGTH_SHORT).show();
    }
  });
}

If I don't use the parcel, and just use the array - it works fine. I commented out my test list and it worked fine, otherwise it crashed.

//          parts.add(new Part("desc", "item id", new BigDecimal(0)));
//          parts.add(new Part("desc2", "item id2", new BigDecimal(1)));
//          parts.add(new Part("desc3", "item id3", new BigDecimal(2)));
        // create a new bundle
        Bundle b = new Bundle();

        // put the list into a parcel
        b.putParcelable("parts", parts);
        Intent i = new Intent(SearchActivity.this, Results.class);

        // put the bundle into the intent
        i.putExtras(b);
        startActivity(i);

Did I do something wrong with the implementation of the Parcel? I can't figure this out. If anyone could help me ASAP - that would be amazing.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

桃扇骨 2024-11-21 17:06:20

在 Parcelable.Creator 的实现中,这看起来很粗略:

public Object[] newArray(int arg0) {
    return null;
}

我相信它应该是:

public Object[] newArray(int arg0) {
    return new PartsList[arg0];
}

如果您要声明它来实现 Parcelable,您还需要为 Part 定义 CREATOR 对象(尽管我不确定为什么它需要)。

In your implementation of Parcelable.Creator, this looks sketchy:

public Object[] newArray(int arg0) {
    return null;
}

I believe it should be:

public Object[] newArray(int arg0) {
    return new PartsList[arg0];
}

You also need to define your CREATOR object for Part if you're going to declare it to implement Parcelable (although I'm not sure why it needs to).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文