2017-12-29 20 views
2

Ich habe ein Kontrollkästchen in RecyclerView Adapter View Item.
Beim Scrollen werden einige Kontrollkästchen aktiviert und einige deaktiviert.
Ich habe Hilfe genommen von this und this
Aber ich bin nicht in der Lage, die genaue Lösung zu finden.Beim Scrollen Checkboxen werden nicht markiert oder umgekehrt in einem RecyclerView

Hier ist mein Code

public class AllContactsAdapter extends RecyclerView.Adapter<AllContactsAdapter.ViewHolder> { 
    private Context context; 
    private ArrayList<PhoneContactsModel> listOfContacts = new ArrayList<>(); 
    PhoneContactsModel phoneContactsModel; 

    private ArrayList<PhoneContactsModel> copyOfListOfContacts = new ArrayList<>(); 

    public AllContactsAdapter(Context context, ArrayList<PhoneContactsModel> listOfContacts) { 
     this.context = context; 
     this.listOfContacts = listOfContacts; 
     // copyOfListOfContacts.addAll(listOfContacts); 
    } 

    @Override 
    public AllContactsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout. 
       adapter_load_allusers_contacts_listitem, parent, false); 
     ViewHolder viewHolder = new ViewHolder(view); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(final AllContactsAdapter.ViewHolder holder, final int position) { 
     Log.d("tag", "adapter========3"); 
     phoneContactsModel = listOfContacts.get(position); 
     holder.name.setText(phoneContactsModel.getContactName()); 
     holder.phoneNumber.setText(phoneContactsModel.getContactNumber()); 
     holder.checkBox.setSelected(phoneContactsModel.isChecked()); 

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

       if (holder.checkBox.isChecked()) { 
        phoneContactsModel.setChecked(false); 
        holder.checkBox.setChecked(false); 
        copyOfListOfContacts.remove(listOfContacts.get(position)); 

       } else { 
        phoneContactsModel.setChecked(true); 
        holder.checkBox.setChecked(true); 
        copyOfListOfContacts.add(listOfContacts.get(position)); 
       } 
      } 
     }); 
    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder { 

     private TextView name, phoneNumber; 
     private CheckBox checkBox; 
     private LinearLayout contactLayout; 

     public ViewHolder(View view) { 
      super(view); 
      name = view.findViewById(R.id.contactNameId); 
      phoneNumber = view.findViewById(R.id.contactNumberId); 
      checkBox = view.findViewById(R.id.checkBoxId); 
      contactLayout = view.findViewById(R.id.contactLayoutId); 
     } 
    } 
} 

Zum Beispiel habe ich 1,2,3 Objekte in der Liste überprüft haben. Wenn ich runterscrolle und hochkomme, dann wird 13 geprüft und 2 wird zusammen mit anderen Items deaktiviert. Bitte helft mir.

Jede Lösung wird geschätzt.

+0

Sie müssen das 'phoneContactsModel' aktualisieren, wenn Benutzer das Kontrollkästchen aktivieren/deaktivieren. –

+0

@MonishKamble können Sie mir klar sagen? – basha

Antwort

0

benachrichtigen Sie Ihren Adapter.

holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      phoneContactsModel.setChecked(b); 
      //notifyItemChanged(position);(if you want to notify change in single item) 
      //or 
      //notifyDataSetChanged();(if you want to notify change in all) 

     } 
    }); 

keine Notwendigkeit, diese Zeile Code verwenden zweimal

holder.checkBox.setSelected(phoneContactsModel.isChecked()); 

// Dieser Abschnitt scheint Buggy Ich gehe davon aus Sie den Artikel der Liste hinzugefügt werden soll, wann immer das Kontrollkästchen überprüft und entfernt es aus der Liste, wenn das Kontrollkästchen deaktiviert ist.

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

       if (phoneContactsModel.isChecked()) { 
        holder.checkBox.setSelected(false); 
        copyOfListOfContacts.remove(listOfContacts.get(position)); 

       } else { 
        holder.checkBox.setSelected(true); 
        copyOfListOfContacts.add(listOfContacts.get(position)); 

       } 
      } 
     } 

);

+0

wird versuchen und aktualisieren Sie – basha

+0

nicht funktioniert man – basha

0

Eine einfache Möglichkeit ist nicht verwenden OnCheckedChangeListener nur OnClickListener auf Kontrollkästchen. Move checkBox onclick innerhalb ViewHolder Klasse.

public class ViewHolder1 extends RecyclerView.ViewHolder implements View.OnClickListener { 
    CheckBox checkBox; 
    public ViewHolder1(View itemView) { 
     super(itemView); 
     checkBox = (TextView) itemView.findViewById(R.id.checkBox); 
     checkBox.setOnClickListener(this); 
    } 
    @Override 
    public void onClick(View v) { 
     if(getAdapterPosition()!=-1) { 
      phoneContactsModel.get(getAdapterPosition()).setChecked(!phoneContactsModel.get(getAdapterPosition()).isChecked()); 
      notifyItemChanged(getAdapterPosition()); 
     } 
    } 
} 

Und

public void onBindViewHolder(final AllContactsAdapter.ViewHolder holder, final int position) { 
    holder.checkBox.setChecked(phoneContactsModel.isChecked()); 
} 
+0

werden versuchen und aktualisieren Sie – basha

+0

funktioniert nicht diese Lösung – basha

+0

Dies sollte funktionieren, wenn Sie es über die Art und Weise getan haben, denke ich. Verwenden Sie 'setChecked (phoneContactsModel.isChecked())' 'anstelle von' setSelected (phoneContactsModel.isChecked()) ''. und entfernen Sie 'CheckedChangeListener'. – ADM

0
@Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 

     final PhoneContactsModel phoneContactsModel = listOfContacts.get(position); 
     holder.name.setText(phoneContactsModel.getContactName()); 
     holder.phoneNumber.setText(phoneContactsModel.getContactNumber()); 
     holder.checkBox.setChecked(/* gets value from the modal */ phoneContactsModel.isChecked()); 

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

       if (compoundButton.isPressed()) { 
        holder.checkBox.setChecked(value); 
        // set the value into the modal. 
        phoneContactsModel.setChecked(value); 
        if (value) { 
         copyOfListOfContacts.remove(phoneContactsModel); 
        } else { 
         copyOfListOfContacts.add(phoneContactsModel); 
        } 
       } 
      } 
     }); 
    } 

Ihre onBindViewHolder Methode wie folgt ändern. Es wird keine unnötigen Kontrollen geben.

+0

Aber ich bekomme Kontrollen nach jeweils 10 Punkten. Zum Beispiel, wenn ich den ersten Gegenstand überprüfe, werden die Gegenstände 11., 21., 31. ... geprüft. – basha

+0

@basha können Sie die gesamte Adapterklasse aktualisieren. – Rolbin

+0

Ja, ich habe die Adapter-Klasse aktualisiert von myAdapter.notifyDataSetChanged(); Methode. – basha

Verwandte Themen