最近学习自定义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实现流式布局的具体代码,供大家参考,具体内容如下 1.概述 本篇给大家带来一个实例,FlowLayout,什么是FlowLayout,我们常在App 的搜索界面看到热门搜索词,就
本文向大家介绍Android进阶教程之ViewGroup自定义布局,包括了Android进阶教程之ViewGroup自定义布局的使用技巧和注意事项,需要的朋友参考一下 前言 在我们的实际应用中, 经常需要用到自定义控件,比如自定义圆形头像,自定义计步器等等。但有时我们不仅需要自定义控件,举个例子,FloatingActionButton 大家都很常用,所以大家也很经常会有一种需求,点击某个 Flo
本文向大家介绍Android自定义ViewGroup之实现FlowLayout流式布局,包括了Android自定义ViewGroup之实现FlowLayout流式布局的使用技巧和注意事项,需要的朋友参考一下 整理总结自鸿洋的博客,希望可以帮到大家。 一、FlowLayout介绍 所谓FlowLayout,就是控件根据ViewGroup的宽,自动的往右添加,如果当前行剩余空间不足,则自动添加到下一行
本文向大家介绍Android自定义ViewGroup之FlowLayout(三),包括了Android自定义ViewGroup之FlowLayout(三)的使用技巧和注意事项,需要的朋友参考一下 本篇继续来讲自定义ViewGroup,给大家带来一个实例:FlowLayout。何为FlowLayout,就是控件根据ViewGroup的宽,自动的往右添加,如果当前行剩余空间不足,则自动添加到下一行,所
本文向大家介绍Android自定义ViewGroup之第一次接触ViewGroup,包括了Android自定义ViewGroup之第一次接触ViewGroup的使用技巧和注意事项,需要的朋友参考一下 整理总结自鸿洋的博客:http://blog.csdn.net/lmj623565791/article/details/38339817/ 一、com.cctvjiatao.customviewg