2016-05-14 19 views
5

Desidero inviare un elenco di oggetti di matrice da un'attività all'altra. Sto estendendo la mia classe di oggetti con Parcelable e l'elenco trasferito usando intent onActivityResult.Invio dell'elenco di matrici di oggetti tra le attività con Parcelable

Ma l'elenco mostra null in seconda attività.

prima attività:

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

    } 
} 

Seconda azione: classe

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

    } 

} 

} 

Oggetto:

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



} 
Non

ottenere ciò che sta andando storto. Qualcuno può aiutare, per favore. Grazie ..

+0

Quando si dice "seconda attività", è quella "Attività" che si chiama 'startActivityForResult()'? –

+0

sì vero. @MikeM. – Sid

risposta

4

Quando si ricevono i risultati di una chiamata startActivityForResult(), il risultato Intent viene passato al metodo onActivityResult() come ultimo parametro. Stai utilizzando il Intent restituito da getIntent(), che è il Intent utilizzato per avviare l'attuale Activity, quindi non avrà gli extra che stai cercando.

In onActivityResult(), ottenere il Bundle dal dataIntent passato nel metodo.

Bundle bundle = data.getExtras(); 

Avrete anche bisogno di rimuovere questa linea in onActivityResult():

mSelectedContacts = bundle.getParcelableArrayList("selectedContacts"); 

e sostituirlo con:

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

E assicurarsi che hai cambiato la chiamata b.putSerializable() in ContactList a b.putParcelableArrayList("selectedContacts", selectedContacts).

2

USO QUESTO

 Bundle b = this.getIntent().getExtras(); 
     mSelectedContacts = b.getParcelableArrayList("selectedContacts"); 

INVECE DI

 Intent i = getIntent(); 
     Bundle bundle = i.getExtras(); 
     mSelectedContacts = i.getParcelableArrayListExtra("selectedContacts"); 
+0

genera un'eccezione di puntatore nullo se lo uso. @satnam singh – Sid

+0

Utilizzare questo pacchetto b = data.getExtras(); mSelectedContacts = b.getParcelableArrayList ("selectedContacts"); –

+0

perché stai usando onactivityResult e il tuo intento sono dati –

1

fare in questo modo:

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

EDIT 2: recuperarlo da:

Bundle bundle = i.getExtras(); 
mContactListActivity = i.getBooleanExtra("contactListActivity",true); 
mSelectedContacts = (ArrayList<contact>) i.getSerializableExtra("selectedContacts"); 

E non dimenticate:

public class contact implements Serializable {...} 

EDIT:

RIMUOVERE (Serializable):

Non scrivere questo:

b.putSerializable("selectedContacts",(Serializable) selectedContacts); 

scrivere questo:

b.putSerializable("selectedContacts",selectedContacts); 
+0

sta dando un errore nell'elenco di Array. Richiesto elenco di array trovato serializzabile. @ Janki gadhiya – Sid

+0

mostra errore come richiesto java.uti.arraylist ha trovato java.io.serializable. Ho implementato serializzabile. @ janki gadhiya – Sid

+0

ho provato a rimuovere anche quello stesso errore. @ janki gadhiya – Sid

2

Ho controllato il codice e ottenere alcuni problemi minori,

Quindi può essere fissandolo si possono ottenere risultati.

Seguire i passaggi seguenti.

(1) Nel file di PlanEventActivity, cambiare onActivityResult da sotto,

@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 = (ArrayList<contact>) bundle.getSerializable("selectedContacts"); 
      mAdapter.notifyDataSetChanged(); 
    } 

     if(mContactListActivity) 
     { 

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

     } 

     else { 

      mContactsList.setVisibility(View.GONE); 
     } 

} 

Come si stanno ottenendo risultati correttamente, ma senza convertirlo in tipo corretto si otterrà nulla, quindi è necessario convertire il risultato Parcelable elenco di array nel tuo arraylist di contatti altrimenti non funzionerà. Inoltre, dopo aver ottenuto l'elenco da visualizzare nella visualizzazione elenco, è necessario notificare all'adattatore che il set di dati è stato modificato. Inoltre, stai mettendo in pausa oggetti serializzabili e poi ottieni il metodo getSerializable.

(2) Implementare Serializable, invece di Parcelable per oggetto, come di seguito

public class contact implements Serializable. 

E ora tenta di eseguire la vostra applicazione, quasi fatto si otterrà risultato.

Problemi correlati