2012-12-12 190 views
1

我有一個活動,我將對象添加到實現Parcelable接口的ArrayList中。然後我通過捆綁將這個列表傳遞給另一個活動,但是當我嘗試在新活動中打印列表的大小時,出現以下錯誤:在活動之間傳遞ArrayList

java.lang.RuntimeException:無法恢復活動{com .example.test/com.example.test.SectionsActivity}:顯示java.lang.NullPointerException

這裏就是我添加到列表的第一個活動:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    Toast.makeText(getApplicationContext(), l.getItemAtPosition(position).toString() + " added to order", Toast.LENGTH_SHORT).show(); 
    // add clicked item to orderData.... 
    MenuItem m = (MenuItem) l.getItemAtPosition(position); 
    // create new item 
    orderData.add(m); 
    subTotal += m.getPrice(); 
    calc(); 
} 

這是我第一次送活動數據通過意向:

confirmBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      b.putParcelable("order", orderData); 
      Intent i = new Intent(v.getContext(), SectionsActivity.class); 
      i.putExtra("data",b); 
      startActivity(i); 

     } 
    }); 

而這正是我試圖找回包和顯示尺寸的第二活動:

@Override 
protected void onResume() { 
    super.onResume(); 
    getIntentData(); 
} 


public void getIntentData(){ 
    Intent i = getIntent(); 
    if(i != null & i.hasExtra("data")){ 
     Toast.makeText(this.getApplicationContext(), "recieved", Toast.LENGTH_LONG).show(); 
     b = i.getExtras(); 
     orderData = b.getParcelable("order"); 
     int size = orderData.size(); 
     Toast.makeText(this.getApplicationContext(), String.valueOf(size), Toast.LENGTH_LONG).show(); 

    } 
} 

任何爲什麼我收到了空指針的想法?這讓我生氣了!

orderData是MenuItemList對象:

public class MenuItemList extends ArrayList <MenuItem> implements Parcelable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 2998684930374219271L; 



public MenuItemList(){ 

} 

public static final Parcelable.Creator<MenuItemList> CREATOR = new Parcelable.Creator<MenuItemList>() { 

    @Override 
    public MenuItemList createFromParcel(Parcel source) { 
     return new MenuItemList(source); 
    } 

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


}; 


public MenuItemList(Parcel source) { 
     readFromParcel(source); 
} 

private void readFromParcel(Parcel source) { 

    this.clear(); 

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

    //Remember order of items written into the Parcel. Important here. 
    for(int i = 0; i < size; i ++){ 
     MenuItem item = new MenuItem(); 
     item.setName(source.readString()); 
     item.setPrice(source.readDouble()); 
     this.add(item); 
    } 
} 

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

    dest.writeInt(size); 

    for(int i = 0; i < size; i ++){ 
     MenuItem item = this.get(i); 
     dest.writeString(item.getName()); 
     dest.writeDouble(item.getPrice()); 

    } 

} 

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

}

變化編寫一個解決的問題:

CHANGED的onClick(視圖v):

@Override 
     public void onClick(View v) { 
      Intent i = new Intent(v.getContext(), SectionsActivity.class); 
      i.putExtra("data", (ArrayList<MenuItem>)orderData); 
      startActivity(i); 

     } 

CHANGED getIntent( ):

public void getIntentData(){ 
    Intent i = getIntent(); 
    if(i != null && i.hasExtra("data")){ 
     Toast.makeText(this.getApplicationContext(), "recieved", Toast.LENGTH_LONG).show(); 
     orderData = i.getParcelableExtra("data"); 
     int size = orderData.size(); 
     Toast.makeText(this.getApplicationContext(), String.valueOf(size), Toast.LENGTH_LONG).show(); 

    } 
} 
+0

我很好奇,爲什麼這個問題得到了-1?這對於至少發佈相關代碼,適當標籤和一些logcat的新用戶來說是令人沮喪的。清楚地解釋問題並顯示努力......令人失望。 +1給你Javacadabra – codeMagic

+0

@codeMagic謝謝你的支持評論! – Javacadabra

+0

不客氣,但這就是這個網站是關於。我剛開始的時候問過更糟糕的問題,但是由於SO社區的支持,我在過去9個月左右學到了很多東西。不要讓消極的人讓你失望,或讓你不要問問題,只要你展示研究成果。我很高興你解決了你的問題。 – codeMagic

回答

5

重寫
問題的邏輯&&是,你有一個額外的包。目前在getIntentData()你必須打電話:

getIntent()      // Fetch the Intent, 
    .getExtras()    // Fetch the Bundle of extras, 
    .getBundle("data")   // Fetch the Bundle "data", 
    .getParcelable("order"); // Then get your parcelable... 

讓我們刪掉不必要的捆綁包。

public void onClick(View v) { 
    Intent i = new Intent(v.getContext(), SectionsActivity.class); 
    i.putExtra("data", orderData); 
    startActivity(i); 
} 

現在更新getIntentData()

Intent i = getIntent(); 
if(i != null && i.hasExtra("data")){ 
    orderData = i.getParcelableExtra("data"); 
    ... 
} 
+0

當我嘗試使用putParcelableArrayList()時我在IDE中得到一個錯誤,說這些參數不是適用。這真是令人沮喪,因爲我可以確切地看到你在說什麼,我只是不知道爲什麼我的變量不適用! – Javacadabra

+0

也許你的標題是誤導性的,你如何定義'orderData'?它是什麼ArrayList的? – Sam

+0

我將在上面的代碼中包含該類。它從我名爲MenuListItem的類實例化,並且該類擴展了Parcelable。 – Javacadabra

4

除非我錯過了什麼,您使用的是按位&,而不是在你的getIntentData()功能

+0

我剛剛注意到,我用&&替換了&&,但結果仍然不變,仍爲空指針錯誤。 – Javacadabra

+0

你似乎沒有在你的'putExtra'中使用關鍵的「訂單」。你把它添加到任何'b',但不是你的意圖(i)。此外,不是你的問題,但你不必將你的int變量轉換成一個字符串顯示在文本中。你可以把你的變量名稱'Toast.makeText(context,variable,length).show()' – codeMagic

+0

我會給你一個趕上位運算符的upvote。 – Sam