【问题标题】:Passing ArrayList between activities在活动之间传递 ArrayList
【发布时间】:2012-12-12 00:35:27
【问题描述】:

我有一个活动,我将对象添加到实现 Parcelable 接口的 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;
}

}

解决问题的代码更改:

改变了点击(查看 v):

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

        }

改变 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();

    }
}

【问题讨论】:

  • 我很好奇为什么这个问题得了-1?这对于至少发布相关代码、适当标签和一些 logcat 的新用户来说是令人沮丧的。清楚地解释了问题并表现出努力......令人失望。 +1 给你 Javacadabra
  • @codeMagic 感谢您的支持评论!
  • 不客气,但这就是这个网站的意义所在。刚开始时,我问过更糟糕的问题,但感谢 SO 社区的支持,在过去 9 个月左右的时间里,我学到了很多东西。只要您表现出研究努力,就不要让消极的人让您失望或阻止您提问。很高兴您解决了您的问题。

标签: android android-intent parcelable


【解决方案1】:

重写
问题是你有一个额外的Bundle。目前在getIntentData()你必须打电话:

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

让我们删掉不必要的Bundle。

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");
    ...
}

【讨论】:

  • 当我尝试使用 putParcelableArrayList() 时,我在 IDE 中收到一个错误,指出参数不适用。这真的很令人沮丧,因为我可以确切地看到你在说什么我只是不知道为什么我的变量不适用!
  • 也许你的标题有误导性,你如何定义orderData? ArrayList 是什么?
  • 我将在上面的代码中包含这个类。它是从一个我命名为 MenuListItem 的类实例化的,该类扩展了 Parcelable。
  • 我更新了我的答案。从您最初的问题来看,我认为 ArrayList 类型是 Parcelable,但 ArrayList 是 Parcelable。
  • 非常感谢,这对您有很大帮助!我不得不稍微更改您的答案以使其正常工作。我包含了对原始问题的更改。
【解决方案2】:

除非我遗漏了什么,否则您在 getIntentData() 函数中使用的是按位 &amp; 而不是逻辑 &amp;&amp;

【讨论】:

  • 我刚刚注意到,我将 & 替换为 && 但不幸的是结果仍然相同,仍然是空指针错误。
  • 您似乎没有在putExtra 中使用“订单”键。您将其添加到任何“b”中,但不是您的意图(i)。此外,这不是您的问题,但您不必将 int 变量转换为字符串以显示在文本中。你可以把你的变量名Toast.makeText(context, variable, length).show()
  • @Sam 谢谢你,谢谢你详细解释了我的想法,但没有花时间去做
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 2012-08-29
  • 2023-03-23
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
相关资源
最近更新 更多