2016-10-04 5 views
0

J'ai une liste de contacts. J'ai une case à cocher pour sélectionner les contacts. Ces contacts sélectionnés que je veux ajouter dans une autre liste appelée liste de tableau d'invitation. J'ai créé une méthode pour ajouter tous les contacts dans la liste d'invitation si la case à cocher est appelée comme pour GoogleContactsSelection. C'est ce que j'utilise dans une activité.objet n'est pas retiré de la liste onCheckedChange écouteur de la case à cocher

J'ai créé une autre méthode pour ajouter des contacts dans arraylist d'invitation si la case est cochée.

Maintenant, je veux supprimer l'objet d'une liste de tableau d'invitation si la case est cochée i.e. onCheckChangeListener de case à cocher.

Mais objet ne se retire de invitationArrayList.

Adaptateur:

 public class InviteAdapter extends RecyclerView.Adapter<InviteAdapter.MyViewHolder> { 

     private ArrayList<Contact> contactArrayList; 
     private Context mContext; 
     public ArrayList<Invitation> invitationArrayList = new ArrayList<>(); 

     public class MyViewHolder extends RecyclerView.ViewHolder { 
      public TextView name; 
      private CheckBox checkBox; 

      public MyViewHolder(View view) { 
       super(view); 
       name = (TextView) view.findViewById(R.id.textContactName); 
       checkBox = (CheckBox) view.findViewById(R.id.checkBox); 

      } 
     } 

     public InviteAdapter(Context context, ArrayList<Contact> contactArrayList) { 
      this.contactArrayList = contactArrayList; 
      this.mContext = context; 

     } 

     @Override 
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View itemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.invite_contact_item, parent, false); 

      return new MyViewHolder(itemView); 
     } 

     @Override 
     public void onBindViewHolder(MyViewHolder holder, final int position) { 
      final Contact contact = contactArrayList.get(position); 
      holder.name.setText(contact.getmFullName()); 

      holder.checkBox.setChecked(contact.getSelected()); 

      holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 

        if(b) 
        { 
         invite(contact); 

         Log.e("inviteList",String.valueOf(invitationArrayList.size())); 
        } 
        else { 
         invitationArrayList.remove(contact); 

         Log.e("inviteList",String.valueOf(invitationArrayList.size())); 
        } 
       } 
      }); 
     } 

     @Override 
     public int getItemCount() { 
      return contactArrayList.size(); 

     } 

     public void toggleContactsSelection(boolean isSelected) { 
      for(Contact contact : contactArrayList) { 
       contact.setSelected(isSelected); 

        invite(contact); 

      } 
      notifyDataSetChanged(); // OR you can use notifyItemRangeChanged - which ever suits your needs 
     } 

     public void invite(Contact contact) 
     { 

      SharedPreferences sharedpreferences = mContext.getSharedPreferences("UserId", Context.MODE_PRIVATE); 

      String mUserId = sharedpreferences.getString("userId",""); 

      DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm", Locale.ENGLISH); 
      String date = df.format(Calendar.getInstance().getTime()); 

      Invitation invitation = new Invitation(); 

      invitation.setSender_id(mUserId); 
      invitation.setDate(date); 
      invitation.setInvitee_no(contact.getmMobileNo()); 
      invitation.setStatus("0"); 
      invitation.setUser_name(contact.getmUserName()); 

      invitationArrayList.add(invitation); 

     } 

     public void removeInvite(int position) 
     { 
      invitationArrayList.remove(position); 
     } 

     public ArrayList<Invitation> getArrayList(){ 
      return invitationArrayList; 
     } 

    } 


What is going wrong? 

EDIT: 

This is an adpater : 


    public class InviteAdapter extends RecyclerView.Adapter<InviteAdapter.MyViewHolder> { 

    private ArrayList<Contact> contactArrayList; 
    private Context mContext; 
    public ArrayList<Invitation> invitationArrayList = new ArrayList<>(); 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     public TextView name; 
     private CheckBox checkBox; 

     public MyViewHolder(View view) { 
      super(view); 
      name = (TextView) view.findViewById(R.id.textContactName); 
      checkBox = (CheckBox) view.findViewById(R.id.checkBox); 

     } 
    } 

    public InviteAdapter(Context context, ArrayList<Contact> contactArrayList) { 
     this.contactArrayList = contactArrayList; 
     this.mContext = context; 

    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.invite_contact_item, parent, false); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     final Contact contact = contactArrayList.get(holder.getAdapterPosition()); 
     holder.name.setText(contact.getmFullName()); 

     holder.checkBox.setChecked(contact.getSelected()); 

     holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 

       if(b) 
       { 
        invite(contact); 

        Log.e("inviteList",String.valueOf(invitationArrayList.size())); 
       } 
       else { 

        contactArrayList.get(position).setSelected(false); 
       // holder.checkBox.setChecked(false); 
        // updateInvites(); 
        Log.e("inviteList",String.valueOf(invitationArrayList.size())); 
       } 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return contactArrayList.size(); 

    } 
    public void setChecked() 
    { 
     for(Contact contact : contactArrayList) { 


     } 
    } 


    public void toggleContactsSelection(boolean isSelected) { 
     for(Contact contact : contactArrayList) { 
      contact.setSelected(isSelected); 

       invite(contact); 

     } 
     notifyDataSetChanged(); // OR you can use notifyItemRangeChanged - which ever suits your needs 
    } 

    public void invite(Contact contact) 
    { 

     Invitation invitation = new Invitation(); 

      SharedPreferences sharedpreferences = mContext.getSharedPreferences("UserId", Context.MODE_PRIVATE); 

      String mUserId = sharedpreferences.getString("userId", ""); 

      DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm", Locale.ENGLISH); 
      String date = df.format(Calendar.getInstance().getTime()); 

      invitation.setSender_id(mUserId); 
      invitation.setDate(date); 
      invitation.setInvitee_no(contact.getmMobileNo()); 
      invitation.setStatus("0"); 
      invitation.setUser_name(contact.getmUserName()); 
      invitation.setContact_id(contact.getContactId()); 

      invitationArrayList.add(invitation); 

    } 
    public ArrayList<Invitation> getArrayList(){ 
     return invitationArrayList; 
    } 

    public void updateInvites(){ 
     invitationArrayList.clear(); 
     for(Contact contact : contactArrayList){ 
      if(contact.getSelected()){ 

       invite(contact); 
      } 
     } 
    } 
} 

Et voici le code d'une activité:

sendInvites.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      mAdapter.updateInvites(); // updating list on sendInvites, 

      invitationArrayList = mAdapter.getArrayList(); 

      Log.e("inviteList",String.valueOf(invitationArrayList.size())); 

      Gson gson = new Gson(); 
      String toServer = gson.toJson(
        Collections.singletonMap("invitations", invitationArrayList) 
      ); 

      new SendMultipleInvitesAsyncTask(InviteContactsActivity.this,InviteContactsActivity.this).execute(toServer); 

      finish(); 
      Intent i = new Intent(InviteContactsActivity.this,InviteContactsActivity.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      startActivity(i); 
     } 
    }); 

Maintenant, je suis mise à jour onSendInvites de la liste, mais quand je cocher ou décocher l'api il dose se conduisait pas comme prévu.

+0

vous pouvez setTag (position) pour cocher la case et obtenir la position et de retirer l'article sur la même position de –

Répondre

1

OK, alors là, je dis,

sont quelques erreurs stupides a. Remplacer

final Contact contact = contactArrayList.get(position); 

avec

final Contact contact = contactArrayList.get(holder.getAdapterPosition()); 

b. Vous ajoutez un objet de classe Invitation

Invitation invitation = new Invitation(); 
    invitation.setSender_id(mUserId); 
    invitation.setDate(date); 
    invitation.setInvitee_no(contact.getmMobileNo()); 
    invitation.setStatus("0"); 
    invitation.setUser_name(contact.getmUserName()); 

    invitationArrayList.add(invitation); 

c.Vous essayez de supprimer objet de la classe Contacts

else { 
        invitationArrayList.remove(contact); 

        Log.e("inviteList",String.valueOf(invitationArrayList.size())); 
       } 

Solution

dans onBindViewHolder

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      contactArrayList.get(holder.getAdapterPosition()).setSelected(b); 
      Log.e("inviteList",String.valueOf(invitationArrayList.size())); 
      } 
     }); 

puis faire une méthode comme

private void updateInvites(){ 
    invitationArrayList.clear(); 
    for(Contacts contacts : contactsArrayList){ 
     if(contacts.isSelected()){ 
      invite(contact); 
     } 
    } 
} 

ici contact.setSeletected(boolean status) et contact.isSelected() sont setters et getters respectivement

EDIT: Here is the link to my blog on RecyclerView which explains most of the concepts of Simple RecyclerView.

+0

où utiliser updateInvites()? Je ne comprends pas Plz pouvez-vous expliquer en détail? @Mohammed Atif – Sid

+0

invite de mise à jour sera la dernière méthode que vous appellerez. juste avant d'utiliser l'objet InvitationArrayList –

+0

Supposons que vous utilisiez 'inviteArrayList()' pour effectuer un appel d'API. appelez cette méthode 'updateInvites()' juste avant de faire l'appel. cela mettra à jour votre liste d'invitation avec les objets sélectionnés, puis vous pouvez utiliser cette liste mise à jour pour effectuer l'appel. –

-1

au lieu d'utiliser l'objet de supprimer l'index d'utilisation pour enlever l'article:

invitationArrayList.remove(position); 

cela fonctionnera.

Vous obtenez indice hors limite, car il peut y avoir l'utilisateur la possibilité supprime l'élément avant de l'ajouter. peut être un élément particulier non présent dans votre liste d'invitation. Donc, pour ce essayer ce code:

if (invitationArrayList!=null && invitationArrayList.size() > 0 && invitationArrayList.size() > position +1){ 
invitationArrayList.remove(position); 
} 
+0

j'essayé d'utiliser cela, mais il a donné moi l'exception indexOutOfBound. @Anjali – Sid

+0

non son ne fonctionne pas, il ne faut pas entrer dans si condition. @Anjali – Sid

+0

oui évidemment, il n'ira pas dans votre liste s'il ne contient pas cet objet – Anjali