源码

1. res/values/attrs.xml

                        

2. res/drawable-hdpi/bugdroid.png


3. res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>                        

4. src/com/example/android/fixedgridlayout/FixedGridLayout.java

package com.example.android.fixedgridlayout;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;/** * A layout that arranges its children in a grid. The size of the cells is set * by the {@link #setCellSize} method and the android:cell_width and * android:cell_height attributes in XML. The number of rows and columns is * determined at runtime. Each cell contains exactly one view, and they flow in * the natural child order (the order in which they were added, or the index in * {@link #addViewAt}. Views can not span multiple cells. */public class FixedGridLayout extends ViewGroup {    int mCellWidth;    int mCellHeight;    public FixedGridLayout(Context context) {        super(context);    }    public FixedGridLayout(Context context, AttributeSet attrs) {        super(context, attrs);        // Read the resource attributes.        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FixedGridLayout);        mCellWidth = a.getDimensionPixelSize(R.styleable.FixedGridLayout_cellWidth, -1);        mCellHeight = a.getDimensionPixelSize(R.styleable.FixedGridLayout_cellHeight, -1);        a.recycle();    }    public void setCellWidth(int px) {        mCellWidth = px;        requestLayout();    }    public void setCellHeight(int px) {        mCellHeight = px;        requestLayout();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST);        int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST);        int count = getChildCount();        for (int index = 0; index < count; index++) {            final View child = getChildAt(index);            child.measure(cellWidthSpec, cellHeightSpec);        }        // Use the size our parents gave us        setMeasuredDimension(resolveSize(mCellWidth * count, widthMeasureSpec),                resolveSize(mCellHeight * count, heightMeasureSpec));    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        int cellWidth = mCellWidth;        int cellHeight = mCellHeight;        int columns = (r - l) / cellWidth;        if (columns < 0) {            columns = 1;        }        int x = 0;        int y = 0;        int i = 0;        int count = getChildCount();        for (int index = 0; index < count; index++) {            final View child = getChildAt(index);            int w = child.getMeasuredWidth();            int h = child.getMeasuredHeight();            int left = x + ((cellWidth - w) / 2);            int top = y + ((cellHeight - h) / 2);            child.layout(left, top, left + w, top + h);            if (i >= (columns - 1)) {                // advance to next row                i = 0;                x = 0;                y += cellHeight;            } else {                i++;                x += cellWidth;            }        }    }}

5. com.example.android.fixedgridlayout.FixedGridLayoutTest.java

package com.example.android.fixedgridlayout;import android.app.Activity;import android.os.Bundle;public class FixedGridLayoutTest extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        FixedGridLayout grid = (FixedGridLayout) findViewById(R.id.grid);        grid.setCellWidth(150);        grid.setCellHeight(180);    }}


说明

FixedGridLayoutTest类,设置如下大小:

        grid.setCellWidth(150);
        grid.setCellHeight(180);

效果图:

Android 根据item大小实现自动排列的GridLayout_第1张图片


FixedGridLayoutTest类,设置如下大小:

        grid.setCellWidth(280);
        grid.setCellHeight(180);

效果图:

Android 根据item大小实现自动排列的GridLayout_第2张图片



更多相关文章

  1. Android 类菜单栏 以及 透明居中排列
  2. Android 默认声音大小修改
  3. android调用系统相机并调整照片大小保存,最后上传照片
  4. Android 如何获取手机内存大小,内置存储空间大小
  5. Android Studio App设置TextView文字内容大小颜色
  6. 无废话Android之android下junit测试框架配置、保存文件到手机内
  7. Android 下控件位置大小调整
  8. android 获取应用程序占用的内存大小
  9. APIDEMO ACTIVITY 屏幕在出现软键盘情况下自适应大小

随机推荐

  1. Android实时获得经纬度,发送给c++服务端
  2. mac 下 在cocos2d-x3.0 创建 Android 项
  3. android 切换activity动画
  4. Android 代码实现的动画
  5. eclipse 项目导入 android studio的方式
  6. Android 通过HTTP POST 上传图片文件
  7. Android Room 数据库
  8. android抓log方法
  9. Android ToastUtils,吐司工具类
  10. 布局概述之帧布局FrameLayout和布局概述