2017-02-17 83 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

相关问题