昨天用到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自适应相同,美观且舒服!!
 谢谢!
 
 
 
 
 
 

 

1
0

GridView Item 大小可能不一样,如何保持同一行的Item 高度大小相同,且GridView高度自适应!的更多相关文章

  1. RecyclerView实现一个页面有多种item,每个item有多个view,并且可以让任意item的任意view自定义监听,通过接口方法进行触发操作

    百度了很多贴子,看着大佬的博客,模仿尝试,最终都是以失败告终,api可能版本不一样, 毕竟博客大佬都是7~8前写的,日期新点的都是好几年前了,多次尝试,还是报出莫名其妙的错. 哎,忧伤. 翻阅各种资料 ...

  2. Qt之美(一):d指针/p指针详解(解释二进制兼容,以及没有D指针就会崩溃的例子。有了D指针,所使用的对象大小永远不会改变,它就是该指针的大小。这个指针就被称作D指针)good

    Translated  by  mznewfacer   2011.11.16 首先,看了Xizhi Zhu 的这篇Qt之美(一):D指针/私有实现,对于很多批评不美的同路人,暂且不去评论,只是想支持 ...

  3. du 使用详解 linux查看目录大小 linux统计目录大小并排序 查看目录下所有一级子目录文件夹大小 du -h --max-depth=1 |grep [

    常用命令 du -h --max-depth=1 |grep [TG] |sort   #查找上G和T的目录并排序 du -sh    #统计当前目录的大小,以直观方式展现 du -h --max-d ...

  4. [Java]获取Window界面的标题栏的高度大小

    利用JFrame继承java.awt.Container类的函数getInsets().该函数返回insets类. import java.awt.Insets; import javax.swing ...

  5. javascript实现限定高度下文字随不同设备自适应改变字体大小至字数完全展示

    function fontAutoMoreLine() { let textBox = document.getElementById("iconTxt"); let maxHei ...

  6. 格式化一个文件的大小(size),或者说是格式化一个app的大小(size)

    long number = 6243161; Formatter.formatFileSize(context, number): 需要导包,import android.text.format.Fo ...

  7. UIScrollView,UICollectionView 和UITableView的属性和方法

    UIScrollView,UICollectionView 和UITableView 三者之间的关系:UIScrollView是 UICollectionView 和 UITableView 的父类. ...

  8. gridView -item 大小调节(dimen-代码引用)

    今天在修改一个gridview的时候,发现里面的内容并不会自动适应,填满整个gridview,而是会产生滑动,尝试了很多的方法,包括在item文件中设定width和height,结果,宽度可调,高度却 ...

  9. UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(二)

    上篇UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一) 讲到该控件的需要和设计过程. 这篇讲讲开发过程中一些重要问题解决. 1.支持 ...

随机推荐

  1. Oracle常用sql语句(三)之子查询

    子查询 子查询要解决的问题,不能一步求解 分为: 单行子查询 多行子查询 语法: SELECT select_list FROM table WHERE expr operator (SELECT s ...

  2. appium---【Mac】Appium-Doctor提示WARN:“ ios_webkit_debug_proxy cannot be found”解决方案

    “ ios_webkit_debug_proxy cannot be found”报错截图如下: 解决方案: 打开terminal终端,分别输入执行结束,再次运行appium-doctor即可看到运行 ...

  3. jmeter-----查看结果树

    在编写接口测试脚本的时候,需要进行调试和查看结果是否正常的情况,这个时候可以使用查看结果树组件进行. 查看结果树中展示了每一个取样器的结果.请求信息和响应信息,可以查看这些内容去分析脚本是否存在问题. ...

  4. 找到最大或最小的N个元素---heapq模块

    堆排序heapq的用法 基本用法: 复杂数据结构: # coding=utf- # example.py # Example of using heapq to find the N smallest ...

  5. 浅谈BUFF设计

    Buff在游戏中无处不在,比如WOW.DOTA.LOL等等,这些精心设计的BUFF,让我们击节赞叹,沉迷其中. 问:BUFF的本质是什么? BUFF 是对一项或多项数据进行瞬间或持续作用的集合.(持续 ...

  6. 借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率

    借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率 使用Visual Studio Code(VS Code)调试的优势 借助VS Co ...

  7. Ubuntu下Node.js开发起步之旅

    因为忙其它的事,把Node.js的学习放下了快两个月了,世事变化还真快,发现很多东东都改变了,express已经升级到4.x了,变化还不小! 我原来的学习过程是在VirtualBox中安装Ubuntu ...

  8. 第三方登陆微博、qq、微信

    源文:http://blog.csdn.net/tivonalh/article/details/60954373 假设是已经申请完成各平台开发者账号. 先来简单的,微博和QQ 微博: 引入微博JS ...

  9. 二安装Python

    因为Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序,放到Linux上也是能够运行的. 要开始学习Python编程,首先 ...

  10. CentOS 7 kibana安装配置

    Kibana 是为Elasticsearch设计的开源分析和可视化平台,你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你可以很容易实现高级的数据分析 ...