變量以下所示:函數
/** * 原始每行最多顯示的個數 */ 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