最近学习自定义viewgroup,我的目标是做一个可以很想滚动的ListvIEw,使用adapter填充数据,并且使用adapter.notifyDataSetChanged()更新数据。
不过一口吃不成一个胖子(我吃成这样可是好几年的积累下来的~~~~),我们一步一步来,这篇笔记首先写一个横向的布局。
代码:
package com.example.libingyuan.horizontallistvIEw.ScrollVIEwGroup;import androID.content.Context;import androID.util.AttributeSet;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;/** * 自定义viewGroup * 很简单的横向布局,把所有的子VIEw都横着排列起来,不可滚动 */public class ScrollVIEwGroup extends VIEwGroup{ public ScrollVIEwGroup(Context context) { this(context,null); } public ScrollVIEwGroup(Context context,AttributeSet attrs) { this(context,attrs,0); } public ScrollVIEwGroup(Context context,AttributeSet attrs,int defStyleAttr) { super(context,defStyleAttr); } @OverrIDe protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) { //重新设置宽高 this.setMeasuredDimension(measureWIDth(wIDthMeasureSpec,heightmeasureSpec),measureHeight(wIDthMeasureSpec,heightmeasureSpec)); } /** * 测量宽度 */ private int measureWIDth(int wIDthMeasureSpec,int heightmeasureSpec) { // 宽度 int sizeWIDth = MeasureSpec.getSize(wIDthMeasureSpec); //宽度的类型 int modeWIDth = MeasureSpec.getMode(wIDthMeasureSpec); //父控件的宽(wrap_content) int wIDth = 0; //子VIEw的个数 int childCount = getChildCount(); //重新测量子vIEw的宽度,以及最大高度 for (int i = 0; i < childCount; i++) { //获取子VIEw VIEw child = getChildAt(i); //测量子VIEw,无论什么模式,这句必须有否则界面不显示子VIEw(一片空白) measureChild(child,wIDthMeasureSpec,heightmeasureSpec); //得到子VIEw的边距 marginLayoutParams lp = (marginLayoutParams) child.getLayoutParams(); //得到宽度 int chilDWIDth = child.getMeasureDWIDth() + lp.leftmargin + lp.rightmargin; //宽度累加 wIDth += chilDWIDth; } //返回宽度 return modeWIDth == MeasureSpec.EXACTLY ? sizeWIDth : wIDth; } /** * 测量高度 */ private int measureHeight(int wIDthMeasureSpec,int heightmeasureSpec) { //高度 int sizeHeight = MeasureSpec.getSize(heightmeasureSpec); //高度的模式 int modeHeight = MeasureSpec.getMode(heightmeasureSpec); //父控件的高(wrap_content) int height = 0; //子VIEw的个数 int childCount = getChildCount(); //重新测量子vIEw的宽度,以及最大高度 for (int i = 0; i < childCount; i++) { //得到子VIEw VIEw child = getChildAt(i); //测量 measureChild(child,heightmeasureSpec); //得到边距 marginLayoutParams lp = (marginLayoutParams) child.getLayoutParams(); //得到高度 int childHeight = child.getMeasuredHeight() + lp.topmargin + lp.bottommargin; //累加高度 height += childHeight; } //求平均高度 height = height / childCount; //返回高度 return modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height; } @OverrIDe protected voID onLayout(boolean changed,int l,int t,int r,int b) { int childleft=0;//子VIEw左边的距离 int chilDWIDth;//子VIEw的宽度 int height=getHeight(); int childCount=getChildCount(); for (int i = 0; i < childCount; i++) { VIEw child=getChildAt(i); marginLayoutParams lp= (marginLayoutParams) child.getLayoutParams(); chilDWIDth=child.getMeasureDWIDth()+lp.leftmargin+lp.rightmargin; //最主要的一句话 child.layout(childleft,childleft+chilDWIDth,height); childleft+=chilDWIDth; } } @OverrIDe public LayoutParams generateLayoutParams(AttributeSet attrs) { return new marginLayoutParams(getContext(),attrs); }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
以上是内存溢出为你收集整理的Android自定义ViewGroup横向布局(1)全部内容,希望文章能够帮你解决Android自定义ViewGroup横向布局(1)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)