2017-02-17 80 views
0

我有一些文字和複選框的回收站視圖我想當用戶選擇複選框只有當前項目是選擇,但當我向下滾動列表 另一個項目也被選中我不知道是什麼問題我的代碼。 我檢出了StackOverflow提供的所有解決方案,但沒有人爲我工作。 請告訴我我的代碼有什麼問題?複選框!當選擇一個項目另一個項目也在RecyclerView中被選中?

我的適配器類是:提前

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(); 
    } 

} 

感謝。

+0

這是很容易的,你應該清除或覆蓋在每個檢查狀態'onBindViewHolder '。持有人被重複使用,因此您可以在項目 –

+0

之前已經「綁定」如何做到這一點? @Eugen Martynon – Champandorid

+0

這樣簡單的問題的五個答案:)你應該跟蹤複選框狀態添加到您的模型或與狀態數組 –

回答

1

添加一個放慢參數Selection_flag在GetAdvReqPackagesListResponse.PackageList並初始化爲零

@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

無法找到getSelection_flag錯誤 – Champandorid

+0

你有沒有添加Selection_flag在你的模型類? – user2025187

+0

不,我沒有這樣做.. – Champandorid

0

添加變量「isSelected」到PackageList的模型CALSS,併爲它創建的getter setter方法。

然後在您的適配器類更新onBindViewHolder功能象下面這樣:

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

你說,你只需要選擇當前項目。如果只想選擇一個項目,則使用RadioButton而不是複選框

請選擇單選按鈕的你一個參考像

private RadioButton lastChecked_CB = null; 
private static int selectedPosition = -1; 

然後在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

這不會發生,因爲位置被滾動時重新排列。下面的代碼將幫助你解決這個問題,我已經發布單獨onBindViewHolder方法的代碼

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(); 
       } 
      }); 


    } 

希望這是有益:)

+0

您剛剛粘貼另一個答案。我已經告訴我,我可以檢查出所有的答案,請告訴我在我的代碼中要更改哪些內容? – Champandorid

+0

@Champandorid:在你的代碼中,你必須處理這個集合,在'onBinViewHolder'.e.e。中使選中的複選框變爲true,這就是我在這段代碼中所做的。請看這個代碼。對於這個問題,你只會得到這樣的代碼 – Jeevanandhan

相關問題