可動態添加數據的複選框

    變量以下所示:函數

/**
  * 原始每行最多顯示的個數
  */
 private static final int INITIAL_MAX_COUNT = 3;
 private Context mContext;
 /**
  * CheckBox 列表
  */
 private List<CheckBox> mCheckBoxs;
 /**
  * 每個CheckBox 顯示的內容
  */
 private List<String> mSelectedBoxContents;

 

    控件繼承自LinearLayout,構造函數中默認設置爲水平排列:this

public CustomCheckBox(Context context, AttributeSet attrs, int defStyle) {

  super(context, attrs, defStyle);

  this.mContext = context;

  this.setOrientation(VERTICAL);

  mCheckBoxs = new ArrayList<CheckBox>();

  mSelectedBoxContents = new ArrayList<String>();

 }

 

    初始化每個CheckBox:.net

private void initCheckBox(LinearLayout linearLayout, String checkBoxText,

   int index) {

  CheckBox checkBox = new CheckBox(mContext);

  checkBox.setText(checkBoxText);

  checkBox.setTextSize(15.0f);

  checkBox.setTextColor(Color.parseColor("#88000000"));

  checkBox.setOnCheckedChangeListener(listener);

  checkBox.setTag(index);

  mCheckBoxs.add(checkBox);

  LinearLayout.LayoutParams checkBoxParams = new LayoutParams(

    LinearLayout.LayoutParams.WRAP_CONTENT,

    LinearLayout.LayoutParams.WRAP_CONTENT);

  checkBoxParams.gravity = Gravity.CENTER_VERTICAL;

  checkBoxParams.weight = 1.0f;

  linearLayout.addView(checkBox, checkBoxParams);

 }

 

    根據顯示的內容,動態生成每個CheckBox,每行顯示3個,超過一行的話每行再另外生成一個LinearLayout,再在每一個LinearLayout裏面填充CheckBox:code

public void setCheckBoxs(List<String> checkBoxContents) {
  if (checkBoxContents == null || !mCheckBoxs.isEmpty())
   return;
  int checkBoxCount = checkBoxContents.size();
  if (checkBoxCount > INITIAL_MAX_COUNT) {
   initOrientation(LinearLayout.VERTICAL);
  } else {
   initOrientation(LinearLayout.HORIZONTAL);
  }
  if (this.getOrientation() == LinearLayout.VERTICAL) {// 豎直顯示
   int checkBoxLines = checkBoxCount % INITIAL_MAX_COUNT == 0 ? checkBoxCount
     / INITIAL_MAX_COUNT
     : checkBoxCount / INITIAL_MAX_COUNT + 1;
   for (int i = 0; i < checkBoxLines; i++) {
    LinearLayout linearLayout = new LinearLayout(mContext);
    linearLayout.setOrientation(LinearLayout.HORIZONTAL);
    LinearLayout.LayoutParams lyParams = new LayoutParams(
      LinearLayout.LayoutParams.MATCH_PARENT,
      LinearLayout.LayoutParams.WRAP_CONTENT);
    /** 最後一行顯示餘下的個數,其他每行顯示最大的顯示數目 */
    int count = (i == (checkBoxLines - 1) ? checkBoxCount
      % INITIAL_MAX_COUNT : INITIAL_MAX_COUNT);
    for (int j = 0; j < count; j++) {
     String checkBoxText = checkBoxContents.get(i
       * INITIAL_MAX_COUNT + j);
     initCheckBox(linearLayout, checkBoxText, i
       * INITIAL_MAX_COUNT + j);
    }
    this.addView(linearLayout, lyParams);
   }
  } else {// 水平顯示
   for (int i = 0; i < checkBoxCount; i++) {
    String checkBoxText = checkBoxContents.get(i);
    initCheckBox(this, checkBoxText, i);
   }
  }
 }

 

    貼碼工做終於完成,其實只要有思路,代碼仍是蠻簡單的。另外也能夠用 RelativeLayout 來實現,具體就再也不作撰述。但願對小夥伴們有用。繼承

完整代碼地址:http://www.oschina.net/code/snippet_1460984_49512ip

最近在運營一個有關反脆弱成長的我的公衆號,歡迎關注get

相關文章
相關標籤/搜索