2017-10-02 2 views
3

J'ai une boîte de dialogue et je veux ajouter un recyclerView ou listView et je sais que je dois utiliser une liste pour contrôler les éléments dans chaque rangée. Maintenant, quand je veux changer la valeur d'une case à cocher ou d'un radioButton toutes les données dans la liste changent. J'ai utilisé Log et j'ai compris que toutes les données booléennes changeaient en même temps. J'ai déplacé tous les articles à une activité mais le problème demeure. Il semble qu'il y ait un lien entre les données arrayList.Toutes les valeurs dans RecycleView et ListView changent pendant que j'utilise le dialogue

J'ai également modifié mes codes et utilisé SwitchCompat, mais toutes les données booléennes dans mDataSet changent lorsque je veux en changer un seul.

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

    private Context mContext; 
    private ArrayList<StructSetOnOffTime> mDataSet; 
    private View mView; 

    public AdapterSetOnOffTime(Context context, ArrayList<StructSetOnOffTime> dataSet) { 
     mContext = context; 
     mDataSet = dataSet; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     int id = R.layout.layout_list_settime_items; 
     mView = LayoutInflater.from(mContext).inflate(id, parent, false); 
     return new ViewHolder(mView); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     holder.mSwitch.setChecked(mDataSet.get(position).setOnOffValue); 
     holder.mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       if(isChecked){ 
        mDataSet.get(position).setOnOffValue = true; 
       }else{ 
        mDataSet.get(position).setOnOffValue = false; 
       } 
      } 
     }); 
    } 

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

    static class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView mTextTitle; 
     public TextView mTextValue; 
     public ImageButton mBtn; 
     public SwitchCompat mSwitch; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      mTextTitle = (TextView) itemView.findViewById(R.id.txtSetTime); 
      mTextValue = (TextView) itemView.findViewById(R.id.txtOnOffStatus); 
      mBtn = (ImageButton) itemView.findViewById(R.id.btnSetTime); 
      mSwitch = (SwitchCompat) itemView.findViewById(R.id.swPrefSwitch); 
     } 
    } 
} 

Mise à jour réponse

Après avoir perdu un jour j'ai reconnu que je fait une petite erreur pour remplir ArrayList et je vais le partager.

méthode précédente de l'adaptateur de remplissage:

StructSetOnOffTime item = new StructSetOnOffTime(); 
    ArrayList<StructSetOnOffTime> arrayList = new ArrayList<>(); 
    for(int i = 0; i < 9; i++){ 
     item.setTimeValue = null; 
     item.setOnOffValue = false; 
     arrayList.add(item); 
    } 

Comme @Anatoli dit, j'eu un problème dans cette section et je l'ai résolu en modifiant la méthode supérieure à celle-ci:

ArrayList<StructSetOnOffTime> arrayList = new ArrayList<>(); 
    for(int i = 0; i < 9; i++){ 
     StructSetOnOffTime item = new StructSetOnOffTime(); 
     item.setTimeValue = null; 
     item.setOnOffValue = false; 
     arrayList.add(item); 
    } 

Répondre

1
  1. Vous définissez à radOn et radOff même OnCheckedChangeListener et vérifie dans l'écouteur s'il a été défini sur true. Pourquoi vous ne faites pas 2 auditeurs?

    CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
          mDataSet.get(position).onOffStatus = true; 
    
          // update adapter 
          notifyDataSetChanged(); 
         } 
        } 
    }; 
    holder.radOn.setOnCheckedChangeListener(listener); 
    
    CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
          mDataSet.get(position).onOffStatus = false; 
    
          // update adapter 
          notifyDataSetChanged(); 
         } 
        } 
    }; 
    holder.radOff.setOnCheckedChangeListener(listener); 
    

semble beaucoup plus simple

  1. appel de

    holder.radOn.setChecked(holder.radOn == buttonView); 
    holder.radOff.setChecked(holder.radOff == buttonView); 
    

déclenche les auditeurs. Pour mettre à jour les valeurs dans la liste, il suffit d'appeler adapter.notifyDataSetChanged();

MISE À JOUR

Pour chaque nouvel élément dans la liste, vous devez initialiser un nouveau support

RecyclerView

@Override 
public Holder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // Inflate the custom layout 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(layoutId, parent, false); 

    return new Holder(itemView, viewType); 
} 

ArayList

@NonNull 
@Override 
public View getView(int position, View convertView, @NonNull ViewGroup parent) { 
    Holder viewHolder; 

    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); 

     viewHolder = new Holder(convertView); 

     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (Holder) convertView.getTag(); 
    } 

    Item item = getItem(position); 

    fill(item, position); 

    return convertView; 
} 
+0

Merci pour votre réponse Anatoli, j'ai changé boutons radio pour SwitchCompat mais le problème est toujours en restant, j'ai une autre classe RecyclerView et il n'a pas de problème, en Dans ce cas, toutes les valeurs booléennes changent quand je change juste l'une d'entre elles. Il semble qu'il y ait un lien entre elles, mais ce n'est pas le cas.Même si je crée une activité et déplace tous les objets, le problème persiste. –

+0

Apparaît-il maintenant seulement dans ListView? Pourriez-vous poster le code, où vous initialisez 'radOff' et' ranOn'? – anatoli

+0

@Mohsen, j'ai créé la vue avec votre adaptateur sur mon côté et ça se voit fonctionner correctement. Mettre à jour (rerun) app sur votre appareil et s'il vous plaît faire des photos avant et après cliquez sur le commutateur – anatoli

1

Lorsque vous définissez l'état de vérification de votre vue (à partir de votre code, même si la vue n'a pas été détruite), votre écouteur de vérification est appelé, vous devez donc gérer manuellement l'état. Il fonctionnera pour tous RadioButton, case à cocher, etc.

holder.mSwitch.setOnCheckedChangeListener(null); 
holder.mSwitch.setChecked(mDataSet.get(position).setOnOffValue); 
holder.mSwitch.setOnClickListener(new OnClickListener(){ 
    //holder.mSwitch.setCheck(!mDataSet.get(position).setOnOffValue); 
    mDataSet.get(position).setOnOffValue = !mDataSet.get(position).setOnOffValue; 
});