Android自定义ViewGroup横向布局(1)

Android自定义ViewGroup横向布局(1),第1张

概述最近学习自定义viewgroup,我的目标是做一个可以很想滚动的listview,使用adapter填充数据,并且使用adapter.notifyDataSetChanged()更新数据。

最近学习自定义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)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147403.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存