2011-06-07 58 views
0

我正在尝试将一个活动的对象的ArrayList传递给另一个活动。经过多次搜索,我发现你可以把东西当作包裹。以下是我落得这样做:包裹问题// 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; 
} 

它也有干将/课程的制定者。

这是创建列表:

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); 

我是否在执行包裹时出错?我无法弄清楚这一点。如果任何人都能尽快帮到我 - 那会很棒。

+0

我也只是在调试器中看到它似乎被扔在一个NullPointerException: \t \t \t SearchActivity.this.parts.add(新部分( “递减”, “项目ID”,BD)); – Cody 2011-06-07 15:46:26

回答

2

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

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

我相信它应该是:

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

您还需要定义CREATOR对象的一部分,如果你是去声明它来实现Parcelable(尽管我不确定它为什么需要)。

+0

我改变了,但我不知道为什么我需要定义CREATOR对象?它的使用方式(我在想如何做到这一点)我不相信他们需要。 – Cody 2011-06-07 15:47:53

+0

如果你要声明Part来实现Parcelable,它需要一个静态的CREATOR对象。从您发布的代码看来,您看起来并不需要声明部分为可发布。除去'implements Parcelable'声明或定义一个CREATOR变量。 – 2011-06-07 15:54:38

+0

谢谢。我从零件中删除了这些工具。无论如何,我不明白为什么我需要它。现在,似乎在将新的BigDecimal()添加到零件列表中时出现错误。一个空指针异常? 这里是一个调试图像的链接: http://imageshack.us/photo/my-images/687/debuggingexception.png/ – Cody 2011-06-07 16:04:44