2017-02-17 5 views
0

Ich habe eine Recycler-Ansicht mit etwas Text und einem Kontrollkästchen Ich möchte, dass wenn Benutzer das Kontrollkästchen nur aktuelle Element auswählen, aber wenn ich scroll die Liste ein anderes Element wurde auch ausgewählt Ich weiß nicht, was ist das Problem mit mein Code. Ich habe alle Lösungen von StackOverflow ausgecheckt, aber niemand arbeitet für mich. Bitte sagen Sie mir, was ist das Problem mit meinem Code?Checkbox! Wenn Sie einen Artikel auswählen Ein anderer Artikel wird auch in RecyclerView ausgewählt?

Meine Adapter Klasse:

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

    Context context; 
    List<GetAdvReqPackagesListResponse.PackageList> packageList; 
    private View rootView; 

    public MyAdapter (List<GetAdvReqPackagesListResponse.PackageList> packageList, 
               Context context) { 
     this.context = context; 
     this.packageList = packageList; 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     TextView textPackageCode, textPackageDesc, textLaborTU, textLaborAmt, 
       textPartsCount, textPartsAmt, textPackageTotal; 

     CheckBox chkBoxSelectPackage; 

     public MyViewHolder(View rowView) { 
      super(rowView); 

      rootView = rowView; 

      textPackageCode = (TextView) rowView.findViewById(R.id.textPackageCode); 
      textPackageDesc = (TextView) rowView.findViewById(R.id.textPackageDesc); 
      textLaborTU = (TextView) rowView.findViewById(R.id.textLaborTU); 
      textLaborAmt = (TextView) rowView.findViewById(R.id.textLaborAmt); 
      textPartsCount = (TextView) rowView.findViewById(R.id.textPartsCount); 
      textPartsAmt = (TextView) rowView.findViewById(R.id.textPartsAmt); 
      textPackageTotal = (TextView) rowView.findViewById(R.id.textPackageTotal); 
      chkBoxSelectPackage = (CheckBox) rowView.findViewById(R.id.chkBoxSelectPackage); 

     } 
    } 

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

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     final GetAdvReqPackagesListResponse.PackageList packageList1 = packageList.get(position); 


     holder.textPackageCode.setText(packageList.get(position).code); 
     holder.textPackageDesc.setText(packageList.get(position).description); 

     if (packageList.get(position).laborTU.equalsIgnoreCase("0")) 
      holder.textLaborTU.setText(String.valueOf("-")); 
     else 
      holder.textLaborTU.setText(packageList.get(position).laborTU); 

     if (packageList.get(position).laborAmt.equalsIgnoreCase("0")) 
      holder.textLaborAmt.setText(String.valueOf("-")); 
     else 
      holder.textLaborAmt.setText(CurrencySymbol.currencySymbol(Constant.appCurrencyCode) + " " 
        + packageList.get(position).laborAmt); 

     if (packageList.get(position).partCount.equalsIgnoreCase("0")) 
      holder.textPartsCount.setText(String.valueOf("-")); 
     else 
      holder.textPartsCount.setText(packageList.get(position).partCount); 

     if (packageList.get(position).partAmt.equalsIgnoreCase("0")) 
      holder.textPartsAmt.setText(String.valueOf("-")); 
     else 
      holder.textPartsAmt.setText(CurrencySymbol.currencySymbol(Constant.appCurrencyCode) + " " 
        + packageList.get(position).partAmt); 


     holder.chkBoxSelectPackage.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 


      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 


       if (isChecked == true) { 
        holder.chkBoxSelectPackage.setChecked(true); 

        holder.textPackageCode.setTextAppearance(context, R.style.font_color_green_size_13sp); 
        holder.textPackageDesc.setTextAppearance(context, R.style.font_color_green_size_13sp); 
        holder.textLaborTU.setTextAppearance(context, R.style.font_color_green_size_13sp); 
        holder.textLaborAmt.setTextAppearance(context, R.style.font_color_green_size_13sp); 
        holder.textPartsCount.setTextAppearance(context, R.style.font_color_green_size_13sp); 
        holder.textPartsAmt.setTextAppearance(context, R.style.font_color_green_size_13sp); 
       } else if (isChecked == false) { 
        holder.chkBoxSelectPackage.setChecked(false); 

        holder.textPackageCode.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
        holder.textPackageDesc.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
        holder.textLaborTU.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
        holder.textLaborAmt.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
        holder.textPartsCount.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
        holder.textPartsAmt.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 


       } 


      } 
     }); 


    } 


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

} 

Vielen Dank im Voraus.

+0

Es ist ganz einfach, sollten Sie auf jeden Zustand überprüfen löschen oder zu überschreiben 'onBindViewHolder '. Halter werden wiederverwendet, so dass Sie bereits vor Artikel –

+0

gebunden werden können. Wie geht das? @Eugen Martynon – Champandorid

+0

Fünf Antworten für solche einfache Frage :) Sie sollten den Checkbox-Status verfolgen, indem Sie zu Ihrem Modell hinzufügen oder mit Array –

Antwort

1

ein Paramter Selection_flag in Ihrem GetAdvReqPackagesListResponse.PackageList hinzufügen und initialisieren auf Null

@Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     final GetAdvReqPackagesListResponse.PackageList packageList1 = packageList.get(position); 

     if (packageList.get(position).getSelection_flag().equals("1")) { 
      subHolder.chkBoxSelectPackage.setChecked(true); 
     } else { 
      subHolder.chkBoxSelectPackage.setChecked(false); 

     } 


     holder.chkBoxSelectPackage.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 


     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 


      if (isChecked == true) { 
       //holder.chkBoxSelectPackage.setChecked(true); 
       packageList.get(position).setSelection_flag("1"); 

       holder.textPackageCode.setTextAppearance(context, R.style.font_color_green_size_13sp); 
       holder.textPackageDesc.setTextAppearance(context, R.style.font_color_green_size_13sp); 
       holder.textLaborTU.setTextAppearance(context, R.style.font_color_green_size_13sp); 
       holder.textLaborAmt.setTextAppearance(context, R.style.font_color_green_size_13sp); 
       holder.textPartsCount.setTextAppearance(context, R.style.font_color_green_size_13sp); 
       holder.textPartsAmt.setTextAppearance(context, R.style.font_color_green_size_13sp); 
      } else if (isChecked == false) { 
       // holder.chkBoxSelectPackage.setChecked(false); 
       packageList.get(position).setSelection_flag("0"); 
       holder.textPackageCode.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
       holder.textPackageDesc.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
       holder.textLaborTU.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
       holder.textLaborAmt.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
       holder.textPartsCount.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
       holder.textPartsAmt.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 


      } 

      notifyDataSetChanged();    
    } 
+0

kann nicht finden getSelection_flag Fehler – Champandorid

+0

haben Sie Selection_flag in Ihrer Modellklasse hinzugefügt? – user2025187

+0

Nein, ich habe das nicht tun .. – Champandorid

0

eine Variable "isSelected" zu Ihrem Modell calss von Paketliste hinzufügen und Getter Setter für sie erstellen.

Dann onBindViewHolder Funktion in Ihrem Adapter-Klasse aktualisieren wie unten:

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

    Context context; 
    List<GetAdvReqPackagesListResponse.PackageList> packageList; 
    private View rootView; 

    @Override 
    public void onBindViewHolder(final MyViewHolder holder, final int position) { 
     final GetAdvReqPackagesListResponse.PackageList packageList1 = packageList.get(position); 


     holder.textPackageCode.setText(packageList.get(position).code); 
     holder.textPackageDesc.setText(packageList.get(position).description); 

     if (packageList.get(position).laborTU.equalsIgnoreCase("0")) 
      holder.textLaborTU.setText(String.valueOf("-")); 
     else 
      holder.textLaborTU.setText(packageList.get(position).laborTU); 

     if (packageList.get(position).laborAmt.equalsIgnoreCase("0")) 
      holder.textLaborAmt.setText(String.valueOf("-")); 
     else 
      holder.textLaborAmt.setText(CurrencySymbol.currencySymbol(Constant.appCurrencyCode) + " " 
        + packageList.get(position).laborAmt); 

     if (packageList.get(position).partCount.equalsIgnoreCase("0")) 
      holder.textPartsCount.setText(String.valueOf("-")); 
     else 
      holder.textPartsCount.setText(packageList.get(position).partCount); 

     if (packageList.get(position).partAmt.equalsIgnoreCase("0")) 
      holder.textPartsAmt.setText(String.valueOf("-")); 
     else 
      holder.textPartsAmt.setText(CurrencySymbol.currencySymbol(Constant.appCurrencyCode) + " " 
        + packageList.get(position).partAmt); 


     holder.chkBoxSelectPackage.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       packageList.get(position).setSelected(isChecked) 
      } 
     }); 

     setItemSelected(holder, packageList.get(position).isSelected); 

    } 

    private void setItemSelected(final MyViewHolder holder, boolean isSelected){ 
     if(isSelected){ 
      holder.chkBoxSelectPackage.setChecked(true); 
      holder.textPackageCode.setTextAppearance(context, R.style.font_color_green_size_13sp); 
      holder.textPackageDesc.setTextAppearance(context, R.style.font_color_green_size_13sp); 
      holder.textLaborTU.setTextAppearance(context, R.style.font_color_green_size_13sp); 
      holder.textLaborAmt.setTextAppearance(context, R.style.font_color_green_size_13sp); 
      holder.textPartsCount.setTextAppearance(context, R.style.font_color_green_size_13sp); 
      holder.textPartsAmt.setTextAppearance(context, R.style.font_color_green_size_13sp); 
     } else{ 
      holder.chkBoxSelectPackage.setChecked(false); 
      holder.textPackageCode.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
      holder.textPackageDesc.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
      holder.textLaborTU.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
      holder.textLaborAmt.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
      holder.textPartsCount.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
      holder.textPartsAmt.setTextAppearance(context, R.style.font_small_color_black_size_13sp); 
     } 
    } 

} 
0

sagte Sie, dass Sie nur die aktuellen Artikel auswählen möchten. Wenn Sie nur ein Element auswählen möchten, verwenden Sie RadioButton anstelle von Kontrollkästchen.

eine Referenz von Ihnen halten

ausgewählt RadioButton- wie
private RadioButton lastChecked_CB = null; 
private static int selectedPosition = -1; 

dann in onBindViewHolder()

if (position == selectedPosition) { 
    holder.myRadioButton.setChecked(true); 
    lastChecked_CB = holder.myRadioButton; 
} 

holder.myRadioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, final boolean isChecked) { 

     if (lastChecked_CB != null) { 
      lastChecked_CB.setChecked(false); 
     } 

     holder.myRadioButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       lastChecked_CB = holder.myRadioButton; 
       selectedPosition = holder.getAdapterPosition(); 
      } 
     }); 
    } 
}); 
0

Dies geschieht, weil Position beim Scrollen neu geordnet wird. Im Folgenden Code wird Ihnen helfen, das Problem zu lösen, habe ich den Code onBindViewHolder Methode geschrieben allein

private SparseArray<SparseBooleanArray> sparseArray = new SparseArray<>(); 

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


       holder.selectEnrollment.setId(position); 
       holder.selectEnrollment.setChecked(false); 

      if (sparseArray.get(holder.selectEnrollment.getId()) != null) { 
       boolean isChecked = sparseArray.get(holder.selectEnrollment.getId()).get(holder.selectEnrollment.getId()); 
       holder.selectEnrollment.setChecked(isChecked); 
      } 

    holder.selectEnrollment.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        sparseArray.clear(); 

      SparseBooleanArray checkedPosition = new SparseBooleanArray(); 
      checkedPosition.put(v.getId(), true); 
      sparseArray.put(tagId, checkedPosition); 
      notifySetDataChanged(); 
       } 
      }); 


    } 

Hoffe, das ist hilfreich :)

+0

Sie haben soeben beklebt eine andere Antwort. Ich habe bereits gesagt, dass ich alle Antworten ausgecheckt habe. Kannst du mir bitte sagen, wo ich meinen Code ändern soll? – Champandorid

+0

@Champandorid: In deinem Code musstest du mit der Einstellung umgehen, dass das ausgewählte "checkbox" in "onBinViewHolder" .i.e wahr ist, was ich in diesem Code gemacht habe. Bitte schauen Sie sich diesen Code an. Für dieses Problem erhalten Sie nur solchen Code – Jeevanandhan

Verwandte Themen