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. php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

    这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...

  2. TMOS_Order_of_Operations_v0.1

  3. HDU——2647Reward(DFS或差分约束)

    Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. POJ 1860: Currency Exchange 【SPFA】

    套汇问题,从源点做SPFA,如果有一个点入队次数大于v次(v表示点的个数)则图中存在负权回路,能够套汇,如果不存在负权回路,则判断下源点到自身的最长路是否大于自身,使用SPFA时松弛操作需要做调整 # ...

  5. 【CCF】棋局评估

    博弈论极小极大搜索,记忆化+状压 #include<iostream> #include<cstdio> #include<string> #include< ...

  6. STL学习笔记(四) 迭代器

    条款26:iterator 优先于 const_iterator, reverse_iterator, const_reverse_iterator iterator, reverse_iterato ...

  7. 济南学习 Day5 T3 晚

    回文串(palindromes) [题目描述] 判断是否能将字符串S分成三段非空回文串. [输入说明] 第一行一个整数T,表示数据组数. 对于每一个组,仅包含一个由小写字母组成的串. [输出说明] 对 ...

  8. POJ 2125 最小点权覆盖集(输出方案)

    题意:给一个图(有自回路,重边),要去掉所有边,规则:对某个点,可以有2种操作:去掉进入该点 的所有边,也可以去掉出该点所有边,(第一种代价为w+,第二种代价为w-).求最小代价去除所有边. 己思:点 ...

  9. HNOI_2002 营业额统计(Splay)

    此题可以用STL的multiset解决,也可以手打一棵伸展树(Splay)来求前驱与后驱. 使用multiset: #include<iostream> #include<set&g ...

  10. Execption异常 手动和自动抛除异常

    package cn.zmh.Exception; /* * * try{ * 需要被检测的语句 * } * catch(异常类 变量){ * 异常的处理语句 * } * finally{ * 一定会 ...