继承LinearLayout实现根据屏幕宽度及内部子View个数自动排布GridView
2014-02-10 18:22
337 查看
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); } } }
相关文章推荐
- J2ME实现展示内容自动根据屏幕宽度换行的功能
- Android实现图片宽度100%ImageView宽度且高度按比例自动伸缩
- 根据屏幕宽度自动适配字体大小,一次使用终身难忘!
- android 字符串根据textview宽度 自动调整自身大小
- 根据屏幕动态设置view的宽度 DisplayMetrics dip2px
- [autoLayout]自动布局下的纯storyboard添加约束--四个imageView平分一个屏幕的宽度
- JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
- 94.大于屏幕宽度的TableView上下拉刷新实现 大于屏幕宽度MJRefresh怎么实现刷新控件显示居中
- js根据手机屏幕宽度自动设置字体大小
- cocos js 实现 滚动字幕 且自动根据文本的宽度稳定滚动速率
- 简单实现ImageView宽度填满屏幕,高度自适应的两种方式
- iOS系统自带的 **UIAlertView** 以及 屏幕自动旋转的实现
- LinearLayout 实现左中右 平分屏幕宽度布局
- 网页怎么根据用户屏幕大小自动调整网页宽度?
- Android实现图片宽度100%ImageView宽度且高度按比例自动伸缩
- 使用viewGrop自定义轮播图中实现图片自适应手机屏幕的宽度
- 如何实现:GridView 控件中显示的文本不自动换行,隐藏超出宽度部分wj-wangjun
- 继承SurfaceView实现图片自动播放
- Android自定义控件继承ViewGrop实现一个GridView的显示效果
- 自定义view继承LinearLayout实现购物车数量的加减