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的更多相关文章

  1. 实现LinearLayout(垂直布局,Gravity内容排布)

    首先上Gravity的代码,Android原版的Gravity搞得挺复杂的,太高端了.但基本思路是使用位运算来做常量,我就自己消化了一些,按自己的思路来实现. 先上代码,在做分析. package k ...

  2. Android开发点滴 - 如何使按钮水平垂直居中且始终占据屏幕宽度一半

    问题描述: 如何使按钮水平垂直居中且始终占据屏幕宽度一半 效果如下: 竖屏: 横屏: 解决方案: 使用线性布局,指定线性布局的总权重(weightSum)为1, 指定按钮的权重为其一半即0.5 布局代 ...

  3. 【浅谈html5 响应式布局之自动适应屏幕宽度】

    允许网页宽度自动调整 “自适应网页设计”到底是怎么做到的?其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name=”viewport” content=”w ...

  4. 移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 )

    序言:应朋友要求随手写了一下移动端 css实现自适应正圆 ( 宽高随着手机屏幕宽度自适应 ) ,以备后用 LESS代码: .adaptive-circle { margin: 50px auto 0; ...

  5. HTML5+CSS3的响应式网页设计:自动适应屏幕宽度

    这几天都在修改博客上面的样式.本来用的是d83.0的模板.自己又修改了许多地方,其中自己修改的一些地方在手机里面显示的效果不是很理想,于是想改成自适应的效果.对CSS3不是特别的熟练,只能去网上找找案 ...

  6. 移动页面HTML5自适应手机屏幕宽度

    标签: 网上关于这方面的文章有很多,重复的东西本文不再赘述,仅提供思路,并解释一些其他文章讲述模糊的地方. 1.使用meta标签,这也是普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的, ...

  7. 获取Android 手机屏幕宽度和高度以及获取Android手机序列号

    1.获取Android 手机屏幕宽度 1 DisplayMetrics dm = new DisplayMetrics(); 2 this.getWindowManager().getDefaultD ...

  8. ios webview 图片自适应屏幕宽度

    //这个知识点主要是自己最近在尝试写后台接口 在移动端展示的时候需要用到这个知识点,在webViewDidFinishLoad方法里面执行一段js代码 拿到各个图片 判断其宽度是否大于当前手机屏幕尺寸 ...

  9. android webview使用心得 屏幕宽度自适应

    webview中右下角的缩放按钮能不能去掉 settings.setDisplayZoomControls(false); //隐藏webview缩放按钮 让Webview加载的页面居中显示有我知道的 ...

随机推荐

  1. POJ-2187 Beauty Contest,旋转卡壳求解平面最远点对!

     凸包(旋转卡壳) 大概理解了凸包A了两道模板题之后在去吃饭的路上想了想什么叫旋转卡壳呢?回来无聊就搜了一下,结果发现其范围真广. 凸包: 凸包就是给定平面图上的一些点集(二维图包),然后求点集组成的 ...

  2. ICMP TYPE CODE

    TYPE CODE Description Query Error 0 0 Echo Reply——回显应答(Ping应答) x   3 0 Network Unreachable——网络不可达   ...

  3. POJ 1286 Necklace of Beads ——Burnside

    [题目分析] 题目大意:一个环有n个点,共染三种颜色.问 在旋转和对称的情况下有多少种本质不同的方案数. Burnside直接做. [代码] #include <cstdio> #incl ...

  4. Java 线程池的原理与实现学习(一)

    线程池:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.    假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中 ...

  5. Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务

    SSH远程管理服务 1. 远程管理服务知识介绍 # 1.1 SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Worki ...

  6. idea16使用maven命令clean、编译、打包jar或者war

    项目环境:idea16+jdk1.7+maven-3.3.9 项目说明:编写简单的java类,使用maven命令生成jar包,然后执行------->"java  -classpath ...

  7. Scrapy学习-8-ItemLoader

    ItemLoader使用 作用 方便管理维护重用xpath或css规则   实例 itemloader+图片处理 # items.py import scrapy from scrapy.loader ...

  8. Linux主机被SSH精神病(Psychos)暴力攻破后成为肉鸡的攻防过程

    近日公司局域网突然变得非常慢,上网受到很大影响,不仅仅是访问互联网慢,就连访问公司内部服务器都感到异常缓慢.于是对本局域网网关进行测试:   $ ping 10.10.26.254   发现延时很大, ...

  9. 详解DNS,你真的懂吗?

    what`s  this ? 概念 域名系统(英文:DomainNameSystem,缩写:DNS)是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.D ...

  10. 关于几种UI框架简单总结

    最近两年多的时间先后做过几款终端程序,UI框架从MFC转向过WxWidgets,之后再转向Qt.三种框架精通远谈不上,用起来还是没什么问题. 简单聊聊三种框架的优缺点. 1.MFC 似乎作为一种饱受批 ...