【问题标题】:How to pass ArrayList of object between activities using Parcelable?如何使用 Parcelable 在活动之间传递对象的 ArrayList?
【发布时间】:2016-05-13 10:15:31
【问题描述】:

我想将对象的数组列表从一个活动发送到另一个活动。为此,我使用 Parcelable 扩展了我的课程。

我仍然没有得到列表。此外,我还发送了一个布尔变量,该值也不会改变。

我的对象类:

public class contact implements Parcelable {

private String contactName;
private String contactId;

contact(){}

contact(String contactId,String contactName)
{
    this.contactId = contactId;
    this.contactName = contactName;

}

public contact(Parcel in) {

    contactId  = in.readString();
    contactName = in.readString();

}
public void writeToParcel(Parcel dest, int flags) {

    dest.writeString(contactId);
    dest.writeString(contactName);

}

public static final Parcelable.Creator<contact> CREATOR = new Parcelable.Creator<contact>()
{
    public contact createFromParcel(Parcel in)
    {
        return new contact(in);
    }
    public contact[] newArray(int size)
    {
        return new contact[size];
    }
};

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

public String getContactName() {
    return contactName;
}

public void setContactName(String contactName) {
    this.contactName = contactName;
}

public String getContactid() {
    return contactId;
}

public void setContactid(String contactId) {
    this.contactId = contactId;
}

}

第一个活动:

   done.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {



            Log.d("selectd",String.valueOf(selectedItemsPositions));

            mContactListActivity = true;

            selectedContacts = new ArrayList<>();//to store selected items

            for (Integer pos : selectedItemsPositions) {
                selectedContacts.add(items.get(pos));
            }

            Intent i = new Intent();

            Bundle bundle = new Bundle();

            bundle.putParcelableArrayList("selectedContacts",selectedContacts);
            bundle.putBoolean("contactListActivity",mContactListActivity);

            i.putExtras(bundle);

            setResult(RESULT_OK, i);

           finish();


        }
    });

}

第二个活动:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {

            Intent i = new Intent();

            Bundle bundle = new Bundle();

            mSelectedContacts = bundle.getParcelableArrayList("selectedContacts");

            mContactListActivity = bundle.getBoolean("contactListActivity");

            if(mContactListActivity)
            {

                addOrganizer.setVisibility(View.INVISIBLE);

            }

            mAdapter.notifyDataSetChanged();

        }
    }
}

编辑:

按照 sush 的建议尝试了这个:

   Intent i = getIntent();

            Bundle bundle = i.getExtras();

            mSelectedContacts = (ArrayList<contact>)bundle.getSerializable("selectedContacts");

            mContactListActivity = bundle.getBoolean("contactListActivity",false);

然后它在列表上抛出空指针异常。

怎么了?

更新:

     mContactListActivity = true;

            selectedContacts = new ArrayList<>();//to store selected items

            for (Integer pos : selectedItemsPositions) {
                selectedContacts.add(items.get(pos));
            }

            Intent i = new Intent(ContactList.this,PlanEventActivity.class);

            i.putExtra("contactListActivity",mContactListActivity);
            i.putExtra("selectedContacts",(Serializable)selectedContacts);

            setResult(RESULT_OK, i);

           finish();

第二个活动:

   Intent i = getIntent();


            mContactListActivity =  i.getBooleanExtra("contactListActivity",true);

mSelectedContacts = (ArrayList)i.getSerializableExtra("selectedContacts");

            Log.e("mSelectedContact ", String.valueOf(mSelectedContacts));
            mAdapter.notifyDataSetChanged();

现在我已经完成了,现在布尔值通过了,但列表显示为空。

【问题讨论】:

    标签: java android android-activity arraylist parcelable


    【解决方案1】:

    试试这样,

    Intent updateIntent = new Intent(FirstActivity.this, SecondActivity.class);
    Bundle bundle = new Bundle();
    bundle.getParcelableArrayList("selectedContacts", selectedContacts);
    updateIntent.putExtra(ContactsActivity.RECIVED_CONTACT, bundle);
    startActivityForResult(updateIntent,1);
    

    在 Second Activity 的 onActivityResult 方法上得到这样的结果

    Bundle bundle = getIntent().getBundleExtra(ContactsActivity.RECEIVED_CONTACT);
    ArrayList<contact> contact = bundle.getParcelableArrayList("selectedContacts");
    

    【讨论】:

    • 我没有使用 ContactsActivity。 @Abhishek Patel
    • 这是演示代码,您可以根据需要进行更改。
    【解决方案2】:
         Bundle bundle = new Bundle(); // here ur creating new bundle and trying get data from empty bundle. 
    
     mSelectedContacts = bundle.getParcelableArrayList("selectedContacts"); 
    
         mContactListActivity = bundle.getBoolean("contactListActivity");
    
    
    
    
    
    
    
    
           Intent i = new Intent();
    
            Bundle bundle = new Bundle();
    
           /* bundle.putParcelableArrayList("selectedContacts",selectedContacts);
            bundle.putBoolean("contactListActivity",mContactListActivity);
    
            i.putExtras(bundle);
            */
           //try below code
            i.putParcelableArrayList("selectedContacts",selectedContacts);
            setResult(RESULT_OK, i);
    

    为您的代码

     as per your code you should go like this
    
         Bundle b = i.getExtras();
    

    【讨论】:

    • 我试过了它现在在 mSelectedcontacts 列表对象上抛出一个空指针异常。 @sush
    【解决方案3】:

    问题出在:您在第二个 Activity 中没有获得 bunble,您正在初始化一个新的 bundle,因此您获得了 null:

    在第二个活动中:

               Bundle bundle =getIntent().getBundle();
    
                mSelectedContacts = bundle.getParcelableArrayList("selectedContacts");
    
                mContactListActivity = bundle.getBoolean("contactListActivity");
    

    【讨论】:

    • 我也尝试过使用可序列化。你能指导我正确的方法吗? @Android 极客
    • 我点击此链接获取可序列化的stackoverflow.com/questions/13601883/… ..
    • 这里在这行给了我错误 intent.putExtra("QuestionListExtra", ArrayListmQuestionList);
    • 我也传递了一个布尔变量为什么也没有通过? @Android 极客
    • 我要担心的问题是为什么布尔对象也没有通过? @AndroidGeek
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2023-03-23
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多