2016-07-22 4 views
0

Ich arbeite mit Recyclerview. Mein recyclerview wird von der Liste bevölkert und es hat beide Zustände des Checkboxes nach dem Füllen. aber ich habe ein Problem, wenn ich an einer bestimmten Position oder nach dem Scrollen seine noch auf ihrer vorherigen Position abhakte. Mein Code ist unten gezeigt.Umgang mit Recyclerview-Status Mit Kontrollkästchen?

@Override 

public void onBindViewHolder(final AttendanceHolder holder, final int position) { 


    holder.statusCheckBox.setOnCheckedChangeListener(null); 
    if(childrenListForAttendance.get(position).getStatus()==0) { 
     holder.statusCheckBox.setTag(childrenListForAttendance.get(position)); 
     holder.childName.setText(childrenListForAttendance.get(position).getMchildName()); 
     holder.statusCheckBox.setChecked(childrenListForAttendance.get(position).isSelected()); 
    } 
    else{ 
     holder.statusCheckBox.setTag(childrenListForAttendance.get(position)); 
     holder.childName.setText(childrenListForAttendance.get(position).getMchildName()); 
     holder.statusCheckBox.setChecked(false); 
    } 

    holder.statusCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      childrenListForAttendance.get(position).setIsSelected(isChecked); 
     } 
    }); 

} 

    @Override 
    public int getItemCount() 

    { 
     return childrenListForAttendance.size(); 
    } 

Wie mit dieser Situation umzugehen. danke im voraus.

Antwort

1

Ich sehe nicht correcly Einstellung geprüft:

holder.statusCheckBox.setChecked(true); 

So correcly Sie deaktivieren, aber wenn wahr ist, Sie nie Checkbox.

Ihr Code ändern:

holder.statusCheckBox.setOnCheckedChangeListener(null); 

//NOT_USED constant with value of status not used 
if(childrenListForAttendance.get(position).getStatus()==NOT_USED){ 

    //code for not used checkbox 
} 
//is checked is constant with value of checked status 
else if(childrenListForAttendance.get(position).getStatus()==IS_CHECKED) { 

    holder.statusCheckBox.setChecked(true); 
    //other code 
} 
//code for uncheck 
else{ 

    holder.statusCheckBox.setChecked(false); 
    //other code 
} 

holder.statusCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     childrenListForAttendance.get(position).setIsSelected(isChecked); 
    } 
}); 
+0

Danke für Ihre Antwort, ich bin in android neue .can u mir ein Codebeispiel –

+0

überprüfen Code geben Sie jedes Mal auf Checkbox aktiviert setzen müssen, und jedes Mal deaktivieren. –

1

Das Problem mit CheckBox innerhalb recyclerview ist, dass die Sicht durch das Recycling von recyclerview und dem Wert der Checkbox (aktivieren oder deaktivieren) wird

nicht gepflegt recycelt wird

Sie schau dir mein Beispiel an. Sie können so etwas tun:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private ArrayList<Model> myItems = new ArrayList<>(); 

    public MyAdapter (ArrayList<Model> getItems, Context context){ 
     try { 
      mContext = context; 
      myItems = getItems; 
      }catch (Exception e){ 
      Log.e(FILE_NAME, "51: " + e.toString()); 
      e.printStackTrace(); 
     } 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView tView; 
     public CheckBox cBox; 

     public ViewHolder(View v) { 
      super(v); 
      tView = (TextView) v.findViewById(R.id.textView); 
      cBox = (CheckBox) v.findViewById(R.id.checkBox); 
     } 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 
     final ObjectIncome objIncome = myItems.get(position); 
     String content = "sample String"; 
     holder.tView.setText(content); 

     //in some cases, it will prevent unwanted situations 
     holder.cBox.setOnCheckedChangeListener(null); 

     //if true, your checkbox will be selected, else unselected 
     if(holder.statusCheckBox.get(position).getStatus()==IS_CHECKED) { 

      holder.statusCheckBox.setChecked(true); 

     } 
     else{ 

      holder.statusCheckBox.setChecked(false); 

     } 
     holder.cBox.setChecked(Model.get(position).isSelected()); 

     holder.cBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        //set your object's last status 
        Model.get(position).setSelected(isChecked); 
      } 
     }); 

    } 
} 
+0

Danke für die Antwort .aber ich benutze das gleiche in meinem Code. Siehe meinen Code –