GridView Item 大小可能不一样,如何保持同一行的Item 高度大小相同,且GridView高度自适应!
2013-08-06 18:38
369 查看
昨天用到GridView,但是遇到几个问题,就是GridView默认的item其实大小是一致的,但是我们经常会遇到item大小不同,系统默认会留白的问题,很头疼!如下图这样的:
就会造成,右图所示,左右大小不一致,中间还留了一块,给人的感觉太差了!!
那如何保证GridView自适应且看起来更美观呢? 达到这样的效果呢??
度娘搜索了,google了,还是没找到好的方法!!但是在一篇blog里得到了 一个思路,就是把GridView对象传进到adapter 里面,然后去动态设置item的height。
这样做就行:
贴出部分关键代码:
private GridView gv; public AtypeAdapter(GridView gv, Context context, List<AtypeEntity> list) { this.gv = gv; this.context = context; this.data = list; }
GridView对象传到对应的adapter里面, 网上很多人人也说了,得到GridVeiw的总的height,然后除以总共的Rows就可以设置所有的行的item高度一致了。但是对于GridView来说,adapter数据都没绑定,怎么可能得到高度呢? 还有一点是,咱们的GridView的每个item的高度是不确定的,就算你算出了GridView的总高度,然后跟item的rows做除法,得到的每行的高度,得到的效果也不是想要的,因为有的item会很大,会比平局高度还大,那会显示不全,有的item会比较小,比平均高度还小很多,会导致留白很大!效果很差!! 我的adapter的每一个item 里面包含了三个textview,textview的内容文字的长度是不固定的,所以按照平均值来写死每个item的高度,是不理想的,也是不行的。
那怎么办? 这么写:
传入的GridView之后,
public View getView(int position, View convertView, ViewGroup parent) { Holder holder; if (convertView == null) { holder = new Holder(); convertView = View.inflate((Activity) this.context, R.layout.atype_adpter, null); holder.atype_serial_num = (TextView) convertView .findViewById(R.id.atype_serial_num); holder.atype_name = (TextView) convertView .findViewById(R.id.atype_name); holder.atype_kusercode = (TextView) convertView .findViewById(R.id.atype_code); convertView.setTag(holder); // 绑定listener监听器,检测convertview的height
holder.update(); } else { holder = (Holder) convertView.getTag(); } holder.atype_serial_num.setText((position + 1) + ""); holder.atype_name.setText(data.get(position).getAfullname()); holder.atype_kusercode.setText(data.get(position).getAusercode());
// 绑定tag
holder.atype_kusercode.setTag(position); // 绑定当前的item,也就是convertview
holder.atype_name.setTag(convertView);
return convertView; } public class Holder { public TextView atype_serial_num; public TextView atype_name; public TextView atype_kusercode; public void update() {
// 精确计算GridView的item高度
atype_kusercode.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { public void onGlobalLayout() { int position = (Integer) atype_kusercode.getTag();
// 这里是保证同一行的item高度是相同的!!也就是同一行是齐整的 height相等
if (position > 0 && position % 2 == 1) { View v = (View) atype_name.getTag(); int height = v.getHeight(); View view = gv.getChildAt(position - 1); int lastheight = view.getHeight();
// 得到同一行的最后一个item和前一个item想比较,把谁的height大,就把两者中 // height小的item的高度设定为height较大的item的高度一致,也就是保证同一 // 行高度相等即可
if (height > lastheight) { view.setLayoutParams(new GridView.LayoutParams( GridView.LayoutParams.FILL_PARENT, height)); } else if (height < lastheight) { v.setLayoutParams(new GridView.LayoutParams( GridView.LayoutParams.FILL_PARENT, lastheight)); } } } }); } }
这样设定以后,adpter的同一行的item的height会相同,保证了GridView同一行的height自适应相同,美观且舒服!!
谢谢!
上一篇:解决ScrollView中填充内容上下会有阴影的问题
顶
1
踩
0
相关文章推荐
- GridView Item 大小可能不一样,如何保持同一行的Item 高度大小相同,且GridView高度自适应!
- GridView Item 大小可能不一样,如何保持同一行的Item 高度大小相同,且GridView高度自适应!
- GridView Item 大小可能不一样,如何保持同一行的Item 高度大小相同,且GridView高度自适应!
- GridView解决同一行item的高度不一样,如何同一行统一高度问题?
- 子元素浮动后,两个子元素高度不一样,父元素自适应高度,子元素自适应为相同高度
- 如何保持左右两个DIV高度相同( how to keep two div with same height)
- GridView(网格布局)基本用法和根据item数量动态自适应显示高度,添加分割线,禁止滑动
- android给Listview或GridView的item设定高度(可能是最好的解决方案)
- Android GridView之添加分隔线,动态设置高度,实现高度自适应,并解决第一个item不显示的问题
- Android GridView自适应Item高度
- ListView和GridView根据item数量自适应高度的工具类封装
- android GridView item设置高度相同
- 自定义GridView item大小 发现和实际大小不一样
- GridView自适应高度后,第一个Item点击无效
- Android GridView设置item的高度与宽度相等、GridView条目宽高相同
- Android GridView如何固定间隔,item能自适应大小(笔记)
- gridview宽度自适应屏幕间距---计算一个item(或某个图片)的占屏幕大小
- <GridVew 高度自适应>设置GirdView中item高度来填满 达到自适应
- Android布局中相同xml文件不同手机显示的界面可能不一样(如华为、小米手机有差异)
- 教你如何在GridView的Item中实现“仿携程首页的按钮”点击缩放效果