继承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加载的页面居中显示有我知道的 ...
随机推荐
- C# 字符串型转数字型
// 当需要将字符串格式的数字转为数字时候,我们会用到的函数为Convert.ToDouble(),// 然而当你的字符串为49,9时,由于包含了逗号,函数会将逗号忽略,直接转为499,// 所以我们 ...
- MAC生成公钥私钥
前言 需要开发者在本地上使用openssl来生成私钥和公钥 由于mac 自带openssl工具,所以不用像windows那样要下载安装openssl工具 步骤 1.创建一个文件夹,终端进入该文件夹 c ...
- SPOJ LCS2 Longest Common Substring II ——后缀自动机
后缀自动机裸题 #include <cstdio> #include <cstring> #include <iostream> #include <algo ...
- HDU4405-Aeroplane chess(概率DP求期望)
Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...
- LA 2218 半平面交
题目大意:n名选手参加铁人三项赛,比赛按照选手在三个赛段中所用的总时间排定名次.已知每名选手在三个项目中的速度Ui.Vi.Wi.问对于选手i,能否通过适当的安排三个赛段的长度(但每个赛段的长度都不能 ...
- BZOJ [P2124] 等差子序列
线段树维护哈希值 要求出现长度大于三的等差子序列,我们只要找到长度等于三的就可以了 初看本题没有思路,只能暴力枚举,O(n^4) 后来发现,这个序列是n的一个排列,那么每个数字都只会出现一次 我们可以 ...
- LightOJ1234 Harmonic Number 调和级数求和
[题目] [预备知识] ,其中r是欧拉常数,const double r= 0.57721566490153286060651209; 这个等式在n很大 的时候 比较精确. [解法]可以在 n较小的时 ...
- Currency Exchange(最短路)
poj—— 1860 Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29851 Ac ...
- 使用css绘制六边形
用css绘制六边形需要使用到三个容器,分别用于绘制六边形的三个部分,如下图所示: 接下来,就是代码了: CSS: ;;border-top: 30px solid #6c6;border-left: ...
- nodejs启动前端项目步骤
在.nuxt目录下打开命令行: 一:npm rm node-sass 二:npm install node-sass 三:npm install 四:npm run dev