【问题标题】:How to get all the checkboxes that are selected by the user如何获取用户选中的所有复选框
【发布时间】:2016-03-18 14:23:59
【问题描述】:

我有一个带有复选框的列表视图。

以下是我的getView方法,

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        view = convertView;

        if (convertView == null) {
            //inflate the view for each row of listview
            view = layoutInflater.inflate(R.layout.rating_item, null);
            mViewHolder = new ViewHolder();

            mViewHolder.mstatus = (TextView) view.findViewById(R.id.ratingStatus);
            mViewHolder.mCheckBox = (CheckBox) view.findViewById(R.id.checkBox);
            view.setTag(mViewHolder);
        } else {
            mViewHolder = (ViewHolder) view.getTag();
        }

        if (StarListHolder.getInstance().getStarOne().toString() != null) {

            String starTest = String.valueOf(listForView.get(position));
            ArrayList<String> starOne = StarListHolder.getInstance().getStarOne();
            List<String> starList = StarTest.getInstance().getStarList();
            mViewHolder.mstatus.setText(starList.get(position));
        }
        return view;
    }}

我如何知道用户选中的复选框数量。

【问题讨论】:

  • 您只关心检查了多少而不是检查哪些?
  • 我关心哪些被检查
  • 您可以使用 isChecked() 方法来获取选中的复选框,为此您可以使用 get view 方法中的位置来获取列表视图每个部分的复选框

标签: android listview checkbox


【解决方案1】:

我猜你会想用这些数据做一些事情并在列表上反映变化。以下是步骤:

1) 在您的适配器中创建一个接口。

interface OnListFragmentInteractionListener {
    void onListFragmentInteraction(String strSelectedItemName, int intPosition);
}

2) 在onBindViewHolder 方法或getView 方法内的整行/复选框上应用点击侦听器,具体取决于您分别使用的是RecyclerView 还是BaseAdapter

holder.Row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (null != mListener) {
                // Notify the active callbacks interface (the activity, if the
                // fragment is attached to one) that an item has been selected.
                mListener.onListFragmentInteraction(holder. strSelectedItemName, intPosition);
            }
        }
    });

3) 在您的 Activity 中实现接口并通知适配器 List 中发生了更改。

@Override
public void onListFragmentInteraction(String strSelectedItemName, int intPosition) {
    if(lsSelection == null)
        lsSelection = new ArrayList<>();
    if(lsSelection.contains(strSelectedItemName)) {
        lsSelectedAreas.remove(strSelectedItemName);
        recyclerViewAdapter.getSelection().remove(strSelectedItemName);
        recyclerViewAdapter.getSelection().put(strSelectedItemName, false);
        recyclerViewAdapter.notifyItemChanged(intPosition);
    } else {
        lsSelectedAreas.add(strSelectedItemName);
        recyclerViewAdapter.getSelection().remove(strSelectedItemName);
        recyclerViewAdapter.getSelection().put(strSelectedItemName, true);
        recyclerViewAdapter.notifyItemChanged(intPosition);
    }
}

这将触发行刷新。要处理 UI 以反映此用户交互,请在您的 getViewonBindViewHolder 方法中插入此条件

//Show selected / unselected checkbox based on isSelected Value
//hmSelection is the HashMap that maintains the list of items selected in the adapter. 
    if((hmSelection.containsKey(holder.strSelectedItemName) && hmSelection.get(holder.strSelectedItemName))
            || lsSelectedList != null && lsSelectedList.contains(holder.strSelectedItemName)) {
        if(!hmSelection.containsKey(holder.strSelectedItemName))
            hmSelection.put(holder.strSelectedItemName, true);
        holder.cbCheckBox.setImageResource(R.drawable.checkedtick_checkbox);
    } else {
        if(!hmSelection.containsKey(holder.strSelectedItemName))
            hmSelection.put(holder.strSelectedItemName, false);
        holder.cbCheckBox.setImageResource(R.drawable.ic_checkbox_unselected);
    }

完成所有操作后,只需返回 List&lt;String&gt; lsSelectedItems 即可获得最终选择。

注意:由于我使用的是自定义设计的复选框,因此我使用 ImageView 代替复选框并将点击事件应用于整行。

【讨论】:

    【解决方案2】:
    //On your Activity or fragment Class
    btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {   
    
    
    
    int count = listView.getAdapter().getCount();
                LinearLayout ll=(LinearLayout)v.findViewById(R.id.ll1);
    
                for (int i = 0; i < count; i++) {
    
                    ll = (LinearLayout) gridView.getChildAt(i);
    
                    CheckBox cb = (CheckBox)ll.findViewById(R.id.checkbox1);
                    TextView tv = (TextView)ll.findViewById(R.id.textView1);
                    //  StringBuilder stringBuilder=new StringBuilder();
                    if (cb.isChecked()) {
    
                        Log.e("CheckBoxch", "" + cb.getTag().toString());
                        Log.e("text", "" + tv.getTag().toString());
                        stringBuilder.append(tv.getTag().toString() + ",");
                        type_of_truck_appended = stringBuilder.toString();
                        if (pwindowforTruckName.isShowing()) {
                            pwindowforTruckName.dismiss();
                        }
    
    
                    }
                } 
    }
    

    【讨论】:

      【解决方案3】:

      像这样试试。

      在您的适配器中全局定义它。

      private static int checkBoxCounter = 0;
      
      mViewHolder.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              if(isChecked && checkBoxCounter>=2){
                  list.get(position).setChecked(false);
                  mViewHolder.mCheckBox.setChecked(false);
      
              }else {
                  if (isChecked) {
                      starOne.add((Integer) mViewHolder.mCheckBox.getTag());
                      checkBoxCounter++;              
                  } else {
                      checkBoxCounter--;
                  }
                  cCheckedItems.setText(checkBoxCounter); //<-- ADD THIS
                  Toast.makeText(context, "there are " + checkBoxCounter + " items selected", Toast.LENGTH_LONG).show();
              }}});
      

      希望这能帮助您解决问题。

      【讨论】:

        【解决方案4】:
        //add a int to you adapter class
        int count = 0;
        
        //add listener to getView()
        mViewHolder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        count++;
                    } else {
                        count--;
                    }
                }
            });
        

        【讨论】:

          【解决方案5】:
          //Create a modal class
          mSparseBooleanArray = new SparseBooleanArray();
          
          @Override
              public View getView(int position, View convertView, ViewGroup parent) {
                  view = convertView;
          
                  if (convertView == null) {
                      //inflate the view for each row of listview
                      view = layoutInflater.inflate(R.layout.rating_item, null);
                      mViewHolder = new ViewHolder();
          
                      mViewHolder.mstatus = (TextView) view.findViewById(R.id.ratingStatus);
                      mViewHolder.mCheckBox = (CheckBox) view.findViewById(R.id.checkBox);
                      view.setTag(mViewHolder);
                  } else {
                      mViewHolder = (ViewHolder) view.getTag();
                  }
          
                  if (StarListHolder.getInstance().getStarOne().toString() != null) {
          mViewHolder.mCheckBox.setTag(position);
                      String starTest = String.valueOf(listForView.get(position));
                      ArrayList<String> starOne = StarListHolder.getInstance().getStarOne();
                      List<String> starList = StarTest.getInstance().getStarList();
                      mViewHolder.mstatus.setText(starList.get(position));
          
                      mViewHolder.mstatus.setOnCheckedChangeListener(new CheckchangeListener(data,mCheckBox));
                  }
                  return view;
              }
          
              //get all checked items by calling this method
          
              public ArrayList<String> getCheckedItems() {
                  ArrayList<String> mTempArry = new ArrayList<String>();
          
                  for (int i = 0; i < listForView.size(); i++) {
                      if (mSparseBooleanArray.get(i)) {
          
                          String data = listForView.get(i);
          
                          mTempArry.add(data);
                      }
                  }
          
                  return mTempArry;
              }
              class CheckchangeListener implements OnCheckedChangeListener {
                  private int position;
          
                  public CheckchangeListener(int position) {
                      // TODO Auto-generated constructor stub
          
                      this.position= position;
          
                  }
          
                  @Override
                  public void onCheckedChanged(CompoundButton buttonView,
                          boolean isChecked) {
                      if (isChecked) {
                          checkbox
                                  .setButtonDrawable(R.drawable.notification_selected_checkbox);
          
                      } else {
                          checkbox
                                  .setButtonDrawable(R.drawable.notification_checkbox);
          
                      }
                      buttonView.setChecked(isChecked);
          
                      mSparseBooleanArray.put((Integer) buttonView.getTag(), isChecked);
          
                  }
              }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-06
            • 2015-06-28
            • 1970-01-01
            相关资源
            最近更新 更多