2011-12-03 2 views
0

개체의 arraylist를 새로운 작업에 전달하려고합니다. 튜토리얼을 따라했는데 마치 모든 작업을 올바르게 수행 한 것처럼 보이지만 프로그램이 계속 충돌하는 것처럼 보입니다. 충돌의 원인이되는 줄과 문제가되는 getParcelableArrayListExtra 비트를 분리하는 코드의 대부분을 주석 처리했습니다. 누구든지 도와 줄 수 있습니까?getParcelableArrayListExtra 문제입니다. 프로그램 크래킹

새로운 활동 : 그것은 중요하지만, 새로운 활동이 대화 상자

@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; 
} 

내에서 호출되고 있는지 모르겠어요 이전 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"); 
     } 
    } 
} 

비트 배열 내에서 전달하고자하는 객체 -

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 
} 

마지막으로이 항목이 있습니다.

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 마커 인터페이스를 구현하여 Serializable로 표시하고이 작업을 모두 할 필요없이 직접 추가 할 수 있습니다 (실제로는 parcelable 만 가능합니다). 서비스에 바인딩 할 때 필요함).

Parcel을 사용하여 클래스를 채우는 스택 추적 또는 mydata의 생성자를 보지 않고서 오류가 발생하는 이유를 말하기 어렵습니다.

+1

필자는 항상 Parcelable을 사용하고 싶습니다. 안드로이드가 Serializable을 최적화 한 방식입니다. 예, 구현하기는 어렵지만 Serializable보다 빠릅니다. 코드를 자세히 관리할수록 실행 환경을 줄여 실행해야합니다. – yorkw