最近学习自定义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, attrs, 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, widthMeasureSpec, 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,0,childLeft+childWidth,height);
childLeft+=childWidth;
}
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new MarginLayoutParams(getContext(),attrs);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# ViewGroup
# 横向布局
# Android动画效果之自定义ViewGroup添加布局动画(五)
# Android自定义ViewGroup之实现FlowLayout流式布局
# Android编程重写ViewGroup实现卡片布局的方法
# Android App开发中自定义View和ViewGroup的实例教程
# Android自定义ViewGroup的实现方法
# Android自定义ViewGroup打造各种风格的SlidingMenu
# 从源码解析Android中View的容器ViewGroup
# Android自定义ViewGroup实现标签浮动效果
# Android应用开发中自定义ViewGroup的究极攻略
# Android自定义ViewGroup实现带箭头的圆角矩形菜单
# 自定义
# 几年
# 很简单
# 做一个
# 很想
# 最主要
# 这篇
# 句话
# 这句
# 大家多多
# 横着
# extends
# null
# context
# View
# public
# attrs
# onMeasure
# void
相关文章:
表情包在线制作网站免费,表情包怎么弄?
创业网站制作流程,创业网站可靠吗?
如何快速登录WAP自助建站平台?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何通过VPS搭建网站快速盈利?
如何生成腾讯云建站专用兑换码?
移民网站制作流程,怎么看加拿大移民官网?
官网网站制作腾讯审核要多久,联想路由器newifi官网
建站之星如何实现网站加密操作?
焦点电影公司作品,电影焦点结局是什么?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
网站制作公司,橙子建站是合法的吗?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何基于PHP生成高效IDC网络公司建站源码?
建站之星展会模版如何一键下载生成?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
黑客如何通过漏洞一步步攻陷网站服务器?
如何在IIS中配置站点IP、端口及主机头?
兔展官网 在线制作,怎样制作微信请帖?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
如何在阿里云购买域名并搭建网站?
香港服务器租用费用高吗?如何避免常见误区?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
济南企业网站制作公司,济南社保单位网上缴费步骤?
手机网站制作与建设方案,手机网站如何建设?
电商网站制作公司有哪些,1688网是什么意思?
黑客如何利用漏洞与弱口令入侵网站服务器?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
Python lxml的etree和ElementTree有什么区别
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
专业公司网站制作公司,用什么语言做企业网站比较好?
C#如何使用XPathNavigator高效查询XML
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
宝塔新建站点报错如何解决?
完全自定义免费建站平台:主题模板在线生成一站式服务
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
网站制作报价单模板图片,小松挖机官方网站报价?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何设置并定期更换建站之星安全管理员密码?
网页设计与网站制作内容,怎样注册网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
图册素材网站设计制作软件,图册的导出方式有几种?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
如何在云主机上快速搭建多站点网站?
如何在Ubuntu系统下快速搭建WordPress个人网站?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
建站之星安装后如何自定义网站颜色与字体?
*请认真填写需求信息,我们会在24小时内与您取得联系。