给GridView设置行高
近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来.
遇到的问题:
1.把item中的宽和高设置match_parent,还是设置成wrap_content,当内容过多的时候,会覆盖下一行的显示的内容.
2.没有一个属性能够给GridView设置行高,那么高度就不能控制.
遇到的问题展示:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTk3NjAzMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">.期望
想到的解决的方法是:
设计思路:1.先把TextView的高度,获取出来
2.把高度存到全局变量中,然后进行和原来的比較,把大的存到全局变量中
3.然后再把全局变量中的高度设置给TextView
如今明确了思路,以下就開始理解代码.
先创建一个activity_main.xml
<span style="font-family:SimSun;font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" > <GridView
android:id="@+id/mygridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:horizontalSpacing="10dp"
android:verticalSpacing="10dp" /> </RelativeLayout></span>
在MainActivity调用
<span style="font-family:SimSun;font-size:18px;">package com.example.gridviewdemo; import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView; public class MainActivity extends Activity { private GridView mygridview; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
} private void initView() {
mygridview = (GridView) findViewById(R.id.mygridview);
mygridview.setNumColumns(Constant.GRIVEW_COLUMN_NUMS);
} /**
*
* @方法名称:initData
* @描写叙述: TODO
* @创建人:yzk
* @创建时间:2014年10月15日 下午2:17:28
* @备注:初始化数据
* @返回类型:void
*/
private void initData() {
List<String> list = new ArrayList<String>();
list.add("新闻");
list.add("体育");
list.add("娱乐");
list.add("我爱探险");
list.add("123");
list.add("我爱骑车旅游");
list.add("相信自己,万事开头难,我的地盘我做主");
list.add("珍爱生命,人人有责");
list.add("come baby");
list.add("2002年的第一场雪");
list.add("冬天的一把火");
mygridview.setAdapter(new MyAdapter(MainActivity.this, list));
} }
</span>
以下是全局变量类.
Constant
<span style="font-family:SimSun;font-size:18px;">package com.example.gridviewdemo;
public class Constant {
public static int GRIVIEW_COLUMN_HEIGHT = 0;// griview设置的高度
public static int GRIVEW_COLUMN_NUMS = 4;// 列数
}
</span>
创建GriView的适配器
<span style="font-family:SimSun;font-size:18px;">public class MyAdapter extends BaseAdapter {
private Context mContext;
private List<String> mdata;
public MyAdapter(Context mContext, List<String> data) {
super();
this.mContext = mContext;
this.mdata = data;
}
@Override
public int getCount() {
if (mdata == null) {
return 0;
}
return mdata.size();
}
@Override
public Object getItem(int position) {
return mdata.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(mContext, R.layout.item_griview, null);
holder.item = (TextView) convertView.findViewById(R.id.item);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
initKeyTextView(holder.item,position);
holder.item.setText((String)getItem(position));
return convertView;
}
class ViewHolder {
TextView item;
}
/**
*
* @方法名称:initKeyTextView
* @描写叙述: TODO
* @创建人:yzk
* @创建时间:2014年10月15日 上午11:58:22
* @备注:获取高度每一个textview的高度,然后进行比較,把最高的设置为TextView的高度
* @param ll
* @param position
* @返回类型:void
* @注意点:1,要把获取的item中TextView的高度存放到全局变量中,这样才会其作用.
* 2.一定要在addOnGlobalLayoutListener监听器中给TextView设置高度,
* 禁止把高度取出,然后在getView中这仅仅高度,这样是无效的
* @设计思路:1.先把TextView的高度,获取出来
* 2.把高度存到全局变量中,然后进行和原来的比較,把大的存到全局变量中
* 3.然后再把全局变量中的高度设置给TextView
*/
public void initKeyTextView(final View ll, final int position) {
ViewTreeObserver vto2 = ll.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ll.getViewTreeObserver().removeGlobalOnLayoutListener(this);
if (position % Constant.GRIVEW_COLUMN_NUMS == 0) {
Constant.GRIVIEW_COLUMN_HEIGHT = 0;
}
if (ll.getHeight() > Constant.GRIVIEW_COLUMN_HEIGHT) {
Constant.GRIVIEW_COLUMN_HEIGHT = ll.getHeight();
}
setHeight(ll, Constant.GRIVIEW_COLUMN_HEIGHT);
}
});
}
public void setHeight(View ll, int height) {
ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, height,
Gravity.CENTER));
}
}</span>
注意点:
1,要把获取的item中TextView的高度存放到全局变量中,这样才会其作用.
2.一定要在addOnGlobalLayoutListener监听器中给TextView设置高度,
禁止把高度取出,然后在getView中这仅仅高度,这样是无效的,(取出的是0,或许源码中用final修饰了, 详细的原因还不清楚,请高手,请给指点一下)
此方法中
在上面用到了ViewTreeObserver动态的获取view的高度,假设想了解其它动态方法,请点击
源代码下载:http://download.csdn.net/detail/forwardyzk/8041089
大家互相探讨,互相进步.
给GridView设置行高的更多相关文章
- 实现Myxls设置行高的功能(转)
MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了.但是作者提供的代码没有设置行高 要实现这个效果,首先需要修改两个文件: 1.Row.c ...
- DataGridView设置行高
.Net中DataGridView控件如何设置行高 在DataGridView控件中,默认的行高很大,而标题头的行高却很小,感觉很不匀称. 标题头的行高比较好设置需要修改两个属性1修改ColumnHe ...
- 闲记 单元格与单元格之间的边 ///字体属性都是font开头,除了颜色属性 ///文本属性都是text开的,除了设置行高。
这两天一直在做网页没有什么太大的问题,期间也考了一场试,对答案的时候老师讲了一些小知识,因此来记录一下. 单元格与单元格之间的边距(cellspaling) list-type-image可以使用图像 ...
- angularjs ui-grid如何动态设置行高
自己开发的公众号,可以领取淘宝内部优惠券 在用ui-grid的时候我们可以用rowHeight设置行高,可是每一行的高度都是一样的,无法根据行内的内容进行自适应.如下图 为了解决这个问题,google ...
- 如何给HTML页面设置行高
设置行高 由于简单还是老样子直接上代码了哦,注意:line-height属性值可以使用固定值如:20px..和百分比如:20%. 如果想让文字垂直居中如下:行高的主要作用是用来设置文本的垂直方向居中对 ...
- Nopi 导出设置行高
1.导出excel行显示不完整数据客户不满意,需要我们处理 ; rowNum <= sheet.LastRowNum; rowNum++) { HSSFRow currentRow = shee ...
- 在safari下input的placeholder设置行高失效
在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font- ...
- 20190316xlVba_设置行高的改进方案
Public Sub AutoSetRowHeight(ByVal sht As Worksheet, Optional RowsInOnePage As Long) Dim BreakRow As ...
- winform,listbox设置行高
//必须要在写这个事件里写才有效果 private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e) { e.ItemH ...
随机推荐
- Centos7 使用firewall管理防火墙
一.Centos7使用firewall的管理防火墙 1.firewalld基本使用 启动:systemctl start firewalld 关闭:systemctl stop firewalld 状 ...
- utf-8 下汉字为什么需要三个字节
Unicode 十六进制码点范围 --> UTF-8 二进制0000 0000 - 0000 007F --> 0xxxxxxx 0000 0080 - 0000 07FF --> ...
- idea 中使用 出现 svn: E155036
在idea中使用svn checkout时 svn出现如上错误. 原因本地的工作副本太旧.command line进入本地工作副本的根目录,执行svn upgrade后 重启idea就可以了.
- js总结(三):面向对象,prototype ,oo模拟
http://aralejs.org/class/docs/competitors.html http://javascript.crockford.com/prototypal.html proto ...
- python的unittest单元测试框架断言整理汇总
自动化脚本最重要的是断言,正确设置断言以后才能帮助我们判断测试用例执行结果. 一.先说说unittest常用的断言吧 常用的就以下几个,网上一搜一大堆.python版本2.7以上都可以调用了. 断言语 ...
- functools内置装饰器
def update_wrapper(wrapper, wrapped, assigned = WRAPPER_ASSIGNMENTS, updated = WRAPPER_UPDATES): def ...
- C# 中的新增功能
百度搜索:C# 中的新增功能 微软有站点专门介绍:C# 中的新增功能. 地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/inde ...
- nginx1.6.3
Nginx1.6.3安装配置 安装时关闭防火墙和selinuxservice iptables stopsed -i "s/selinux=enabled/selinux=disable/g ...
- 七牛云赵之健:多维度融合赋能视频 AI 的实践
6 月 30 日下午,赵之健在七牛架构师实践日第二十九期进行了<多维度融合赋能视频 AI 的实践>为题的实战分享. 作者简介: 赵之健,七牛人工智能实验室资深算法工程师, 七 ...
- HDU 5242 利用树链剖分思想进行贪心
题目大意: 在给定带权值节点的树上从1开始不回头走到某个底端点后得到所有经过的点的权值后,这些点权值修改为0,到达底部后重新回到1,继续走,问走k次,最多能得到多少权值之和 这其实就是相当于每一次都走 ...