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. appium+python自动化-adb offline(5037端口被占)

    前言 adb连手机的时候经常会出现offline的情况,一般杀掉adb,然后重启adb可以解决. 如果发现不管怎么重启adb都连不上,一直出现offlie的情况,这个时候很大可能就是adb的5037端 ...

  2. oracle sequence的用法

    在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系. 1.Create Sequence     首先要有CREATE SEQUENCE或者CREATE ...

  3. jmeter历史版本下载

    https://archive.apache.org/dist/jmeter/binaries/

  4. TOJ 4095: love168yk的选美大赛

    4095: love168yk的选美大赛  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: ...

  5. TOJ 2596: Music Notes

    2596: Music Notes  Time Limit(Common/Java):1000MS/10000MS     Memory Limit:65536KByteTotal Submit: 3 ...

  6. 九度oj 题目1342:寻找最长合法括号序列II

    题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即 ...

  7. HTML中字体单位px pt em之间的转换

    在实现打印功能时,遇到一个问题,使用px作为单位在不同的机器或者打印机上打印出的字体大小不一样,所以经过查询,发现使用pt为单位能够进行物流适配,下面是各单位之间的转换: 定义字体大小有常见三种单位, ...

  8. 玩转css样式选择器----利用padding实现元素等比缩放

  9. NOJ 1116 哈罗哈的大披萨 【淡蓝】 [状压dp+各种优化]

    我只能说,珍爱生命,远离卡常数的题...感谢陈老师和蔡神,没有他们,,,我调一个星期都弄不出来,,,, 哈罗哈的大披萨 [淡蓝] 时间限制(普通/Java) : 1000 MS/ 3000 MS   ...

  10. hdu 5040 Instrusive【BFS+优先队列】

    11733274 2014-09-26 12:42:31 Accepted 5040 62MS 1592K 4848 B G++ czy 先转一个优先队列的用法: http://www.cppblog ...