码迷,mamicode.com
首页 > 其他好文 > 详细

可动态添加数据的复选框

时间:2015-07-16 20:12:44      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

    变量如下所示:

/**
  * 原始每行最多显示的个数
  */
 private static final int INITIAL_MAX_COUNT = 3;
 private Context mContext;
 /**
  * CheckBox 列表
  */
 private List<CheckBox> mCheckBoxs;
 /**
  * 每一个CheckBox 显示的内容
  */
 private List<String> mSelectedBoxContents;

    控件继承自LinearLayout,构造函数中默认设置为水平排列:

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:

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:

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_49512

可动态添加数据的复选框

标签:

原文地址:http://my.oschina.net/u/1460984/blog/479399

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!