2017-10-26 2 views
0

Unten ist der my-Code.Duplizierung in Checkbox-Auswahl in RecyclerView

holder.followDiseaseCheckBox.setOnClickListener(new View.OnClickListener() { 
     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
     @Override 
     public void onClick(View view) { 

      if (holder.followDiseaseCheckBox.isChecked()) { 

       holder.followDiseaseCheckBox.setChecked(true); 

       checkBoxClicked++; 
       holder.followDiseaseCheckBox.setChecked(true); 
       // for Follow. 
       if (isFollowOrUnFollow.equals("FOLLOW")) { 

        ((FollowActivity) context).diseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id"))); 
        ((FollowActivity) context).setFollowButton(true); 

       } 
       // for Unfollow. 
       else if (isFollowOrUnFollow.equals("UN_FOLLOW")) { 

        ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id"))); 
        ((FollowTwoActivity) context).setUnFollowDiseaseButton(true); 
       } 


      } else { 

       holder.followDiseaseCheckBox.setChecked(false); 

       checkBoxClicked--; 
       holder.followDiseaseCheckBox.setChecked(false); 
       // for Follow. 
       if (isFollowOrUnFollow.equals("FOLLOW")) { 
        ((FollowActivity) context).diseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id"))); 
       } 
       // for Unfollow. 
       else if (isFollowOrUnFollow.equals("UN_FOLLOW")) { 
        ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id"))); 
       } 

       if (checkBoxClicked == 0) { 

        // for Follow. 
        if (isFollowOrUnFollow.equals("FOLLOW")) { 
         ((FollowActivity) context).setFollowButton(false); 
         ((FollowActivity) context).diseaseListFromAdapter.clear(); 
        } 
        // for Unfollow. 
        else if (isFollowOrUnFollow.equals("UN_FOLLOW")) { 

         ((FollowTwoActivity) context).setUnFollowDiseaseButton(false); 
         ((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.clear(); 
        } 
       } 
      } 

     } 
    }); 

Problem ist, wenn ich ein checkBox einschließlich checkBox einige andere checkBox im RecyclerView wird geprüft wählen. Aber wenn ich einchecke adapter Artikel wurde richtig hinzugefügt, aber checkBox Auswahl werden verdoppelt.

Bsp: Wenn ich den ersten Artikel checkBox überprüfte und nach unten scrolle, werden auch 16 Artikel checkBox geprüft. Wenn Sie das Kontrollkästchen checkBox deaktivieren, wird auch das erste Element deaktiviert.

Antwort

1

Die Recycler-Ansicht recycelt die Ansicht in OnBindViewHolder. Wenn Elemente angeklickt werden, werden sie in anderen Positionen angezeigt. So erstellen Sie ein globales SparseBooleanArray zum Speichern der angeklickten Position.

Dann innerhalb des endgültigen Viewholder fügen Sie den clickListener und onClick Store die Position des angeklickten Elements.

public class ViewHolder extends RecyclerView.ViewHolder { 
    public YOURVIEW view; 
    public ViewHolder(View v) { 
     super(v); 
     view = (YOURVIEW) v.findViewById(R.id.YOURVIEWID); 
     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       array.put(getAdapterPosition(),true); 
       notifyDataSetChanged(); 
      } 
     }); 
    } 
} 

Und innen OnBindViewHolder,

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    if(array.get(position)){ 
     holder.followDiseaseCheckBox.setChecked(true); 
    }else{ 
     holder.followDiseaseCheckBox.setChecked(false); 
    } 
} 
+0

Dank mate. Es funktioniert. –

+0

Ihre herzlichsten :) – Anonymous

2
public class CardViewDataAdapter extends RecyclerView.Adapter<CardViewDataAdapter.ViewHolder> { 
    private List<Student> stList; 
    public CardViewDataAdapter(List<Student> students) { 
     this.stList = students; 
    } 

@Override 
public CardViewDataAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // create a new view 
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
    R.layout.cardview_row, null); 

    // create ViewHolder 

    ViewHolder viewHolder = new ViewHolder(itemLayoutView); 

    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 

    final int pos = position; 

    viewHolder.tvName.setText(stList.get(position).getName()); 

    viewHolder.tvEmailId.setText(stList.get(position).getEmailId()); 

    viewHolder.chkSelected.setChecked(stList.get(position).isSelected()); 

    viewHolder.chkSelected.setTag(stList.get(position)); 


    viewHolder.chkSelected.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
    CheckBox cb = (CheckBox) v; 
    Student contact = (Student) cb.getTag(); 

    contact.setSelected(cb.isChecked()); 
    stList.get(pos).setSelected(cb.isChecked()); 

    Toast.makeText(
     v.getContext(), 
     "Clicked on Checkbox: " + cb.getText() + " is " 
     + cb.isChecked(), Toast.LENGTH_LONG).show(); 
    } 
    }); 

} 

// Return the size arraylist 
@Override 
public int getItemCount() { 
    return stList.size(); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView tvName; 
    public TextView tvEmailId; 

    public CheckBox chkSelected; 

    public Student singlestudent; 

    public ViewHolder(View itemLayoutView) { 
    super(itemLayoutView); 

    tvName = (TextView) itemLayoutView.findViewById(R.id.tvName); 

    tvEmailId = (TextView) itemLayoutView.findViewById(R.id.tvEmailId); 
    chkSelected = (CheckBox) itemLayoutView.findViewById(R.id.chkSelected); 

    } 

} 

// method to access in activity after updating selection 
public List<Student> getStudentist() { 
    return stList; 
} 
} 

Für mehr Verständnis über die Auswahl der Checkbox, folgen diese link

+0

@Shaido & alfakini - Relevante Antwort bereits geschrieben, ich beantworte nicht die gleiche Lösung, warum wies der Referenzlink zu mehr Verständnis. Ich denke, das wird helfen, das Konzept zu klären. –

+0

@MohammadMisbah Links können in der Zukunft brechen, daher ist es bevorzugt, die relevanten Informationen in der Antwort selbst zu haben. Wenn die Informationen die Frage nicht beantworten, können Sie sie als Kommentar posten oder Informationen zu einer vorhandenen Antwort hinzufügen. – Shaido

+0

@ Shaido - Ja du hast Recht, Sicher werde ich meine Antwort aktualisieren. Danke für die Überprüfung. –

1

Sie könnten einige Konzepte von recylerview haben fehlen. Fakt ist, dass RecyclerView dieselbe Ansicht nach jeweils 9 Elementen bindet/recycelt. Um dies zu vermeiden, verwenden Sie einfach setItemViewCacheSize() in Ihrer Aktivität.

Beispiel:

contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList); 
     mRecyclerView.setItemViewCacheSize(contactArrayList.size()); 
     mRecyclerView.setAdapter(contactListAdapter); 

public void setItemViewCacheSize (int size) Die Anzahl der Off-Screen- Ansichten vor zu halten, sie zu den potenziell gemeinsamen recycelt Ansicht Pool hinzufügen. Der Offscreen-View-Cache behält die Änderungen im angebundenen Adapter bei, sodass ein LayoutManager diese Ansichten unverändert wiederverwenden kann, ohne dass er zum erneuten Binden an den Adapter zurückkehren muss. Parameter: Größe - Anzahl der Sicht Offscreen zwischenzuspeichern, bevor sie auf die allgemeine recycelten Ansicht Pool

0
public class SuggestionListAdapter extends RecyclerView.Adapter<SuggestionListAdapter.SuggestionListViewHolder> { 

private List<Suggestion> mSuggestionList; 
private Context mContext; 



public class SuggestionListViewHolder extends RecyclerView.ViewHolder{ 
    private CheckBox mCheckBox; 
    private LinearLayout mParent; 


    public SuggestionListViewHolder(View itemView) { 
     super(itemView); 
     mCheckBox = (CheckBox)itemView.findViewById(R.id.list_display_checkbox); 
     mParent =(LinearLayout)itemView.findViewById(R.id.list_parentll); 
    } 
} 

public SuggestionListAdapter(List<Suggestion> suggestionList, Context context) { 
    this.mSuggestionList = suggestionList; 
    this.mContext = context; 
} 

@Override 
public SuggestionListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View new_suggestion_list_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.suggestion_list,parent,false); 
    return new SuggestionListViewHolder(new_suggestion_list_view); 
} 
@Override 
public void onBindViewHolder(final SuggestionListViewHolder holder, final int position) { 

    final Suggestion suggestion = mSuggestionList.get(position); 

    holder.mCheckBox.setText(suggestion.getCategory()); 
    holder.mCheckBox.setOnCheckedChangeListener(null); 
    holder.mCheckBox.setSelected(suggestion.isSelected()); 
    holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       suggestion.setSelected(true); 
      }else { 
       suggestion.setSelected(false); 
      } 
     } 
    }); 
    holder.mCheckBox.setChecked(suggestion.isSelected()); 
} 

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

}

haben einen Blick auf dieses Beispiel zurückkehr Ich bin sicher, Sie finden, wo Sie sind Fehler machen und du kannst dein Problem lösen.

Verwandte Themen