java - 使用 Parcelable 在 Activity 之间发送对象数组列表

标签 java android android-activity arraylist parcelable

我想将一个对象数组列表从一个 Activity 发送到另一个 Activity 。我正在使用 Parcelable 扩展我的对象类,并使用 intent onActivityResult 传输列表。

但列表在第二个 Activity 中显示为空。

第一个 Activity :

public class PlanEventActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener,
DatePickerDialog.OnDateSetListener{

private boolean mHoursMode;
RelativeLayout chooseEvent,time,date;
EditText eventName;
TextView timeTextView,dateTextView,chooseEventText;
static final int CUSTOM_DIALOG_ID = 0;
ListView dialog_ListView;
private ImageView addOrganizer;
static final int PICK_CONTACT_REQUEST = 1;
private ArrayList<contact> mSelectedContacts;
private ListViewAdapter mAdapter;
private ListView mContactsList;
private ArrayList<Integer> selectedItemsPositions;
private boolean mContactListActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_plan_event);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle("");

    TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
    toolbarTitle.setText("MeaVita");
    setSupportActionBar(toolbar);

    setUpUI();

    mAdapter = new ListViewAdapter(this,mSelectedContacts);
    mContactsList.setAdapter(mAdapter);
    mAdapter.setMode(Attributes.Mode.Single);

    mContactsList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ((SwipeLayout)(mContactsList.getChildAt(position - mContactsList.getFirstVisiblePosition()))).open(true);
        }
    });

}

public void setUpUI()
{
    chooseEvent = (RelativeLayout)findViewById(R.id.chooseEventLayout);

    time = (RelativeLayout)findViewById(R.id.timeLayout);

    date = (RelativeLayout)findViewById(R.id.dateLayout);

    eventName  = (EditText)findViewById(R.id.editTextEventName);

    timeTextView = (TextView)findViewById(R.id.timeTextView);

    dateTextView = (TextView)findViewById(R.id.dateTextView);

    chooseEventText = (TextView)findViewById(R.id.chooseEventTextView);

    addOrganizer = (ImageView)findViewById(R.id.addOrganizer);

    mContactsList = (ListView)findViewById(R.id.selectedContactsList);

    mSelectedContacts = new ArrayList<>();

    contact contact = new contact();

    contact.setContactid("1");
    contact.setContactName("sid");


    mSelectedContacts.add(contact);
    contact.setContactid("2");
    contact.setContactName("ssss");

    mSelectedContacts.add(contact);

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

            Intent pickContactIntent = new Intent(PlanEventActivity.this,ContactList.class);
            startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

        }
    });



@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) {


            Bundle bundle = data.getExtras();

            mContactListActivity =  bundle.getBoolean("contactListActivity",true);
            mSelectedContacts = bundle.getParcelableArrayList("selectedContacts");
        }

        if(mContactListActivity)
        {

            addOrganizer.setVisibility(View.INVISIBLE);
            mContactsList.setVisibility(View.VISIBLE);

        }

        else {

            mContactsList.setVisibility(View.GONE);
        }

    }
}

第二个 Activity :

public class ContactList extends AppCompatActivity {

private ArrayList<contact> contact_list = null;
private contactAdapter mContactAdapter = null;

private ArrayList<contact> items;
private ArrayList<contact> selectedContacts;
boolean[] isChecked;
Cursor mCursor;
ListView lv;
public int RQS_PICK_CONTACT = 1;
private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
ArrayList<Integer> selectedItemsPositions;
private ImageView done;
private boolean mContactListActivity;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_contacts_list);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    toolbar.setTitle("");
    TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);

    toolbarTitle.setText("Select Contacts");

    setSupportActionBar(toolbar);

    done = (ImageView)findViewById(R.id.done);

    contact_list = new ArrayList<contact>();

    selectedContacts = new ArrayList<contact>();

    lv = (ListView)findViewById(R.id.list);

    showContacts();


    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(ContactList.this,PlanEventActivity.class);

            Bundle b = new Bundle();
            b.putSerializable("selectedContacts",(Serializable) selectedContacts);
            i.putExtras(b);

            setResult(RESULT_OK, i);

           finish();


        }
    });

}

@SuppressWarnings("unused")
private void getContacts() {


    String[] projection = new String[] {
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.HAS_PHONE_NUMBER,
            ContactsContract.Contacts._ID };


    mCursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null,null);

    while (mCursor.moveToNext()) {
        contact contact = new contact();

        String contactId = mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts._ID));

        contact.setContactid(mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts._ID)));
        contact.setContactName(mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
        contact_list.add(contact);
    }
    isChecked = new boolean[mCursor.getCount()];

    for (int i = 0; i < isChecked.length; i++) {
        isChecked[i] = false;
    }


    this.mContactAdapter = new contactAdapter(this, R.layout.contact_list_item, contact_list);
    lv.setAdapter(this.mContactAdapter);
 //   mCursor.close();

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RQS_PICK_CONTACT) {
        if (resultCode == RESULT_OK) {

            getContacts();

        }
    }
}

public class contactAdapter extends ArrayAdapter<contact> {


    public contactAdapter(Context context, int textViewResourceId, ArrayList<contact> items1) {
        super(context, textViewResourceId, items1);
        items = items1;
        selectedItemsPositions = new ArrayList<>();
    }

//to store all selected items position

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder mViewHolder;

        if (convertView == null) {
            mViewHolder = new ViewHolder();
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.contact_list_item, parent, false);
            mViewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox);
            mViewHolder.name = (TextView) convertView.findViewById(R.id.name);

            mViewHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean ischecked) {
                    int position = (int) mViewHolder.cb.getTag();
                    if (ischecked) {
                        //check whether its already selected or not
                        if (!selectedItemsPositions.contains(position))
                            selectedItemsPositions.add(position);
                    } else {
                        //remove position if unchecked checked item
                        selectedItemsPositions.remove((Object) position);
                    }
                }
            });

            convertView.setTag(mViewHolder);
        } else {
            mViewHolder = (ViewHolder) convertView.getTag();
        }

        contact contacts = items.get(position);
        mViewHolder.cb.setTag(position);

        if (selectedItemsPositions.contains(position))
            mViewHolder.cb.setChecked(true);
        else
            mViewHolder.cb.setChecked(false);

        mViewHolder.name.setText(contacts.getContactName());


        return convertView;
    }


    public class ViewHolder {
        CheckBox cb;
        TextView name;
    }


}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission is granted
            getContacts();
        } else {
            Toast.makeText(this, "Until you grant the permission, we canot display the names", Toast.LENGTH_SHORT).show();
        }
    }
}


private void showContacts()
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
        //After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method
    }

    else {

        getContacts();

    }

}

}

项目等级:

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) {
        this();
        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;
    }



}

不明白哪里出了问题。谁能帮忙。谢谢..

最佳答案

当您收到 startActivityForResult() 调用的结果时,结果 Intent 将作为最后一个传递到 onActivityResult() 方法中范围。您正在使用从 getIntent() 返回的 Intent,这是用于启动当前 ActivityIntent , 所以它不会有你正在寻找的额外内容。

onActivityResult() 中,从传递给方法的 data Intent 中获取 Bundle

Bundle bundle = data.getExtras();

您还需要在 onActivityResult() 中删除这一行:

mSelectedContacts = bundle.getParcelableArrayList("selectedContacts");

并将其替换为:

ArrayList<contact> newContacts = bundle.getParcelableArrayList("selectedContacts");
mSelectedContacts.addAll(newContacts);
mAdapter.notifyDataSetChanged();

并确保您已将 ContactList 中的 b.putSerializable() 调用更改为 b.putParcelableArrayList("selectedContacts", selectedContacts).

关于java - 使用 Parcelable 在 Activity 之间发送对象数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37222728/

相关文章:

java - 使用抽象类和 Android Activity

java - 文本输入延迟

java - 显示不同数组类型的值

java - 将两个列表结构链接在一起

java - 在 fragment 中引用 MapView 时出现异常 - OSMdroid

android - 如何在 Linux 机器上为 Android 构建 linux 命令

android - Google Maps URL 在 Android 上的 Xamarin webview 中显示为空白

java - 在单击事件上创建单选按钮以更改 java 中的微调器数组

android - ACTION_SEND 用于发送短信

Android:创建 Activity 而不是透明背景的全屏