Android增强的LinearLayout,带分隔线

Android增强的LinearLayout,带分隔线.类似ListView,但是不支持Adapter.


/**
 * 增强的线性布局<BR>
 * 1.添加分隔线功能
 * 
 * @author Hxuejie hxuejie@126.com
 */
public class SuperLinearLayout extends LinearLayout {

	private Drawable	divider;
	private int			dividerSize;
	private boolean		isHeadDivider;
	private boolean		isEndDivider;
	private String		doubleDividers;
	private int			doubleDividerSpace;
	private List<View>	dividerList;

	public SuperLinearLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		dividerList = new ArrayList<View>();

		TypedArray a = context.obtainStyledAttributes(attrs,
				R.styleable.SuperLinearLayout);
		final int N = a.getIndexCount();
		for (int i = 0; i < N; i++) {
			int attr = a.getIndex(i);
			switch (attr) {
			case R.styleable.SuperLinearLayout_divider:
				divider = a.getDrawable(attr);
				break;
			case R.styleable.SuperLinearLayout_dividerSize:
				dividerSize = a.getDimensionPixelSize(attr, 1);
				break;
			case R.styleable.SuperLinearLayout_dividerHead:
				isHeadDivider = a.getBoolean(attr, true);
				break;
			case R.styleable.SuperLinearLayout_dividerEnd:
				isEndDivider = a.getBoolean(attr, true);
				break;
			case R.styleable.SuperLinearLayout_dividerDouble:
				doubleDividers = a.getString(attr);
				break;
			case R.styleable.SuperLinearLayout_dividerDoubleSize:
				doubleDividerSpace = a.getDimensionPixelSize(attr, 5);
				break;
			}
		}
		a.recycle();
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		if (divider == null) {
			return;
		}
		// clear
		removeAllDividers();
		// add dividers
		int count = getChildCountByVisible();
		if (count == 0) {
			return;
		}
		int index = 1;
		// Head
		if (isHeadDivider) {
			insertDivider(0, 0);
			++index;
		}
		// Between
		for (int i = 1; i < count; ++i, ++index) {
			insertDivider(index++, 0);
			if (isDoubleDivider(i)) {
				insertDivider(index++, doubleDividerSpace);
			}
		}
		// End
		if (isEndDivider) {
			insertDivider(-1, 0);
		}
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		
		// reset divider size 
		int mh, mw, dw, dh;
		for (View v : dividerList) {
			switch (getOrientation()) {
			case HORIZONTAL:
				dw = dividerSize;
				dh = getMeasuredHeight();
				break;
			default:
			case VERTICAL:
				dw = getMeasuredWidth();
				dh = dividerSize;
				break;
			}
			v.getLayoutParams().width = dw;
			v.getLayoutParams().height = dh;
			mh = MeasureSpec.makeMeasureSpec(dh, MeasureSpec.EXACTLY);
			mw = MeasureSpec.makeMeasureSpec(dw, MeasureSpec.EXACTLY);
			v.measure(mw, mh);
		}
		
	}

	/**
	 * 得到可显示的子控件的数量
	 * 
	 * @return
	 */
	private int getChildCountByVisible() {
		int count = 0;
		for (int i = 0; i < getChildCount(); ++i) {
			if (getChildAt(i).getVisibility() != View.VISIBLE) {
				continue;
			}
			++count;
		}
		return count;
	}

	/**
	 * 插入分隔线
	 * 
	 * @param index
	 * @param space
	 */
	private void insertDivider(int index, int space) {
		View divider = createDivider();
		LayoutParams lp = createDividerLayoutParams();
		lp.topMargin = space;
		addViewInLayout(divider, index, lp);
	}

	/**
	 * 删除所有分隔线
	 */
	private void removeAllDividers() {
		Iterator<View> it = dividerList.iterator();
		while (it.hasNext()) {
			View v = it.next();
			removeView(v);
			it.remove();
		}
	}

	/**
	 * 检测插入的位置是否为双分隔线
	 * 
	 * @param index 插入位置
	 * @return
	 */
	private boolean isDoubleDivider(int index) {
		return doubleDividers.contains(String.valueOf(index));
	}

	/**
	 * 创建一条分隔线,并添加到分隔线列表
	 * 
	 * @return
	 */
	private View createDivider() {
		View dv = new View(getContext());
		dv.setBackground(divider);
		dividerList.add(dv);
		return dv;
	}

	private LayoutParams createDividerLayoutParams() {
		LayoutParams lp;
		switch (getOrientation()) {
		case HORIZONTAL:
			lp = new LayoutParams(1, dividerSize);
			break;
		default:
		case VERTICAL:
			lp = new LayoutParams(dividerSize, 1);
			break;
		}
		return lp;
	}

}
-------------------------------------------------------------------------

XML自定义属性:

<declare-styleable name="SuperLinearLayout">
        <attr name="divider" format="reference|color" />
        <attr name="dividerSize" format="dimension" />
        <attr name="dividerHead" format="boolean" />
        <attr name="dividerEnd" format="boolean" />
        <attr name="dividerDouble" format="string" />
        <attr name="dividerDoubleSize" format="dimension" />
</declare-styleable>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值