继承LinearLayout实现根据屏幕宽度及内部子View个数自动排布GridView
public class VerticalSearchGridView extends LinearLayout implements View.OnClickListener {
    private int mItemWidth;
    private int mItemHeight;
    public int mColumes;
    public int mRows;
    private final static int ITEM_MIN_HEIGH = DisplayManager.dipToPixel(75);
    private final static int ITEM_WIDTH = DisplayManager.dipToPixel(75);
    private final static int PADDING_LR= DisplayManager.dipToPixel(10);
    private List<SearchEngineInfo> mSearchEngineInfos;
    public VerticalSearchGridView(Context context) {
        super(context);
    }
    public VerticalSearchGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public VerticalSearchGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    public void setData(List<SearchEngineInfo> searchEngineInfos){
        mSearchEngineInfos = searchEngineInfos;
        for (int i = 0; i < mSearchEngineInfos.size(); i++) {
          SearchEngineGridItem item = new SearchEngineGridItem();
          View childView = item.getView(i, this);
          childView.setOnClickListener(this);
          childView.setId(i);
          addView(childView);
      }
    }
    @Override
    public void onClick(View v) {
        int position = v.getId();
        mOnitemClickListener.onItemClick(null, v, position, position);
    }
    private OnItemClickListener mOnitemClickListener;
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.mOnitemClickListener=onItemClickListener;
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int menuWidth = mItemWidth;
        int menuHeight = mItemHeight;
        for (int i = 0; i < mRows; i++) {
            for (int j = 0; j < mColumes; j++) {
                int index = i * mColumes + j;
                if (index < getChildCount()) {
                    View child = getChildAt(index);
                    int x = j * menuWidth;
                    int y = i * menuHeight;
                    child.layout(x + PADDING_LR, y, x + menuWidth + PADDING_LR, y + menuHeight);
                }
            }
        }
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) {
            widthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec),
                    MeasureSpec.EXACTLY);
        }
        if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec),
                    MeasureSpec.EXACTLY);
        }
        int width = DisplayManager.screenWidthPixel(getContext()) - getResources().getDimensionPixelSize(R.dimen.search_engine_grid_margin_left)
                - getResources().getDimensionPixelSize(R.dimen.search_engine_grid_margin_right);
        int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        measureChildren(MeasureSpec.makeMeasureSpec(ITEM_WIDTH, MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
        int maxHeight = ITEM_MIN_HEIGH;
        int maxWidth = 0;
        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = getChildAt(i);
            maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
            maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
        }
        mItemWidth = maxWidth;
        mItemHeight = maxHeight;
        int totleCount = mSearchEngineInfos.size();
        width = width - PADDING_LR * 2;
        int oneLineCount = width / mItemWidth;
        if(totleCount < oneLineCount){
            mColumes = totleCount;
            mRows = 1;
        }else {// 一排放不下
            mItemWidth = width / oneLineCount; //平均放
            int adds = 0;
            if (totleCount % oneLineCount != 0) {
                adds = 1;
            }
            mColumes = oneLineCount;
            mRows = totleCount / oneLineCount + adds; // 计算行数
        }
        setMeasuredDimension(mItemWidth * mColumes + PADDING_LR * 2, mItemHeight * mRows);
    }
    private final static int ITEM_PADDING_LR = DisplayManager.dipToPixel(5);
    private class SearchEngineGridItem {
        public View getView(int position, ViewGroup parent) {
            View convertView = createView(parent);
            bindView(position, convertView);
            return convertView;
        }
        private View createView(ViewGroup parent) {
            View v = LayoutInflater.from(getContext()).inflate(R.layout.search_engine_item, parent,
                    false);
            return v;
        }
        private void bindView(int position, View view) {
            final ImageView engineImg = (ImageView) view.findViewById(R.id.engine_item_img);
            final TextView engineName = (TextView) view.findViewById(R.id.engine_item_text);
            ThemeManager tm = ThemeManager.getInstance();
            view.findViewById(R.id.engine_item).setBackgroundDrawable(
                    tm.getDrawable(R.drawable.search_engine_item_bg));
            SearchEngineInfo searchEngineInfo = mSearchEngineInfos.get(position);
            Drawable drawable = searchEngineInfo.getIconDrawable();
            tm.applyDrawableAlpha(drawable);
            engineImg.setBackgroundDrawable(drawable);
            engineName.setTextColor(tm.getColor(R.color.search_engine_choose_item_textcolor));
            engineName.setText(searchEngineInfo.getTitle());
            engineName.setPadding(ITEM_PADDING_LR, 0, ITEM_PADDING_LR, 0);
        }
    }
}
继承LinearLayout实现根据屏幕宽度及内部子View个数自动排布GridView的更多相关文章
- 实现LinearLayout(垂直布局,Gravity内容排布)
		首先上Gravity的代码,Android原版的Gravity搞得挺复杂的,太高端了.但基本思路是使用位运算来做常量,我就自己消化了一些,按自己的思路来实现. 先上代码,在做分析. package k ... 
- Android开发点滴 - 如何使按钮水平垂直居中且始终占据屏幕宽度一半
		问题描述: 如何使按钮水平垂直居中且始终占据屏幕宽度一半 效果如下: 竖屏: 横屏: 解决方案: 使用线性布局,指定线性布局的总权重(weightSum)为1, 指定按钮的权重为其一半即0.5 布局代 ... 
- 【浅谈html5 响应式布局之自动适应屏幕宽度】
		允许网页宽度自动调整 “自适应网页设计”到底是怎么做到的?其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name=”viewport” content=”w ... 
- 移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 )
		序言:应朋友要求随手写了一下移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 ) ,以备后用 LESS代码: .adaptive-circle { margin: 50px auto 0; ... 
- HTML5+CSS3的响应式网页设计:自动适应屏幕宽度
		这几天都在修改博客上面的样式.本来用的是d83.0的模板.自己又修改了许多地方,其中自己修改的一些地方在手机里面显示的效果不是很理想,于是想改成自适应的效果.对CSS3不是特别的熟练,只能去网上找找案 ... 
- 移动页面HTML5自适应手机屏幕宽度
		标签: 网上关于这方面的文章有很多,重复的东西本文不再赘述,仅提供思路,并解释一些其他文章讲述模糊的地方. 1.使用meta标签,这也是普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的, ... 
- 获取Android 手机屏幕宽度和高度以及获取Android手机序列号
		1.获取Android 手机屏幕宽度 1 DisplayMetrics dm = new DisplayMetrics(); 2 this.getWindowManager().getDefaultD ... 
- ios webview  图片自适应屏幕宽度
		//这个知识点主要是自己最近在尝试写后台接口 在移动端展示的时候需要用到这个知识点,在webViewDidFinishLoad方法里面执行一段js代码 拿到各个图片 判断其宽度是否大于当前手机屏幕尺寸 ... 
- android webview使用心得 屏幕宽度自适应
		webview中右下角的缩放按钮能不能去掉 settings.setDisplayZoomControls(false); //隐藏webview缩放按钮 让Webview加载的页面居中显示有我知道的 ... 
随机推荐
- appium+python自动化-adb offline(5037端口被占)
			前言 adb连手机的时候经常会出现offline的情况,一般杀掉adb,然后重启adb可以解决. 如果发现不管怎么重启adb都连不上,一直出现offlie的情况,这个时候很大可能就是adb的5037端 ... 
- oracle sequence的用法
			在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系. 1.Create Sequence 首先要有CREATE SEQUENCE或者CREATE ... 
- jmeter历史版本下载
			https://archive.apache.org/dist/jmeter/binaries/ 
- TOJ 4095: love168yk的选美大赛
			4095: love168yk的选美大赛 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: ... 
- TOJ 2596: Music Notes
			2596: Music Notes Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByteTotal Submit: 3 ... 
- 九度oj 题目1342:寻找最长合法括号序列II
			题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ... 
- HTML中字体单位px pt em之间的转换
			在实现打印功能时,遇到一个问题,使用px作为单位在不同的机器或者打印机上打印出的字体大小不一样,所以经过查询,发现使用pt为单位能够进行物流适配,下面是各单位之间的转换: 定义字体大小有常见三种单位, ... 
- 玩转css样式选择器----利用padding实现元素等比缩放
- NOJ 1116 哈罗哈的大披萨 【淡蓝】  [状压dp+各种优化]
			我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS ... 
- hdu 5040 Instrusive【BFS+优先队列】
			11733274 2014-09-26 12:42:31 Accepted 5040 62MS 1592K 4848 B G++ czy 先转一个优先队列的用法: http://www.cppblog ... 
