2011-12-03 72 views
0

我试图将一个对象的数组列表传递给一个新的活动,我跟着一个教程,它看起来好像我做的一切正确,但我的程序不断崩溃。我已经注释掉了大部分代码来隔离似乎导致崩溃的行,以及它似乎成为问题的getParcelableArrayListExtra位。谁能帮忙?getParcelableArrayListExtra问题。程序崩溃

新活动:从旧activity-- 的代码

public class DatabaseSearch extends ListActivity{ 
    DBAdapter db = new DBAdapter(this); 
    ArrayList<String> listrecipes = new ArrayList<String>(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.databasesearch); 

     Intent i = getIntent(); 
     if (i != null) { 
      ArrayList<mydata> data = i.getParcelableArrayListExtra ("com.example.MyPantry.array"); 
     } 
    } 
} 

位我不知道它的问题,但新的活动正在一个对话框

@Override 
protected Dialog onCreateDialog(int id) 
{ 

    switch(id) { 
    case 0: 
     return new AlertDialog.Builder(this) 
     .setIcon(R.drawable.icon) 
     .setTitle("List all recipes that match over:") 
     .setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int item) { 
       // TODO Auto-generated method stub 
       switch (item) 
       { 
       case 0: 
        percentageselected = 25; 
        break; 
       case 1: 
        percentageselected = 50; 
        break; 
       case 2: 
        percentageselected = 75; 
        break; 
       case 3: 
        percentageselected = 100; 
        break; 
       default: 
        break; 
       } 
      } 
     }) 
     .setPositiveButton("OK", new 
       DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, 
       int whichButton) 
       { 
        if (percentageselected == 0) 
        { 
         Toast.makeText(getBaseContext(), "Please make a selection", Toast.LENGTH_SHORT).show(); 
        } 
        else 
        { 
         Intent intent = new Intent(getBaseContext(), DatabaseSearch.class); 
         intent.putParcelableArrayListExtra("com.example.MyPantry.array", array); 
         startActivity(intent); 
        } 
       } 
     }) 
     .setNegativeButton("Cancel", new 
       DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, 
        int whichButton) 
      { 
       dialog.dismiss(); 
      } 
     }) 
     .create(); 

    } 
    return null; 
} 

中调用我想要通过的阵列中的物体 -

public class mydata implements Parcelable { 

private int recipeID; 
private int ingredientID; 
private String check = "unchecked"; 
private int percentage = 0; 


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

@Override 
public void writeToParcel(Parcel data, int flags) { 
    // TODO Auto-generated method stub 
     data.writeInt(recipeID); 
     data.writeInt(ingredientID); 
     data.writeString(check); 
     data.writeInt(percentage); 
} 

    //Other functions 
} 

最后我有这个cl屁股的教程指示我做...

public class MyCreator implements Parcelable.Creator<mydata> { 
@Override 
public mydata createFromParcel(Parcel source) { 
    // TODO Auto-generated method stub 
    return new mydata(source); 
} 

@Override 
public mydata[] newArray(int arg0) { 
    // TODO Auto-generated method stub 
    return new mydata[arg0]; 
} 

}

所以我知道这是相当多看看,但我只是想彻底。问题开始发生在新活动的if语句中。

回答

0

当意图之间只传递数据,你可以标记您的类可序列化(通过实现Serializable标记接口),并直接将它们添加到意图当临时演员,而不必做这一切工作,parcelable(parcelable是唯一真正绑定到服务时需要)。

很难说没有看到堆栈跟踪或mydata的构造函数为什么会出现错误,而该构造函数使用Parcel填充类。

+1

我宁愿总是使用Parcelable,它是一个Android的Serializable的优化方式。是的,这很难实现,但比Serializable更快。您在代码中处理得越多,运行时环境需要处理的运行就越少。 – yorkw