近期在工作中遇到了这样一个问题,使用一个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设置行高的更多相关文章

  1. 实现Myxls设置行高的功能(转)

    MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了.但是作者提供的代码没有设置行高 要实现这个效果,首先需要修改两个文件: 1.Row.c ...

  2. DataGridView设置行高

    .Net中DataGridView控件如何设置行高 在DataGridView控件中,默认的行高很大,而标题头的行高却很小,感觉很不匀称. 标题头的行高比较好设置需要修改两个属性1修改ColumnHe ...

  3. 闲记 单元格与单元格之间的边 ///字体属性都是font开头,除了颜色属性 ///文本属性都是text开的,除了设置行高。

    这两天一直在做网页没有什么太大的问题,期间也考了一场试,对答案的时候老师讲了一些小知识,因此来记录一下. 单元格与单元格之间的边距(cellspaling) list-type-image可以使用图像 ...

  4. angularjs ui-grid如何动态设置行高

    自己开发的公众号,可以领取淘宝内部优惠券 在用ui-grid的时候我们可以用rowHeight设置行高,可是每一行的高度都是一样的,无法根据行内的内容进行自适应.如下图 为了解决这个问题,google ...

  5. 如何给HTML页面设置行高

    设置行高 由于简单还是老样子直接上代码了哦,注意:line-height属性值可以使用固定值如:20px..和百分比如:20%. 如果想让文字垂直居中如下:行高的主要作用是用来设置文本的垂直方向居中对 ...

  6. Nopi 导出设置行高

    1.导出excel行显示不完整数据客户不满意,需要我们处理 ; rowNum <= sheet.LastRowNum; rowNum++) { HSSFRow currentRow = shee ...

  7. 在safari下input的placeholder设置行高失效

    在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font- ...

  8. 20190316xlVba_设置行高的改进方案

    Public Sub AutoSetRowHeight(ByVal sht As Worksheet, Optional RowsInOnePage As Long) Dim BreakRow As ...

  9. winform,listbox设置行高

    //必须要在写这个事件里写才有效果 private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e) { e.ItemH ...

随机推荐

  1. Centos7 使用firewall管理防火墙

    一.Centos7使用firewall的管理防火墙 1.firewalld基本使用 启动:systemctl start firewalld 关闭:systemctl stop firewalld 状 ...

  2. utf-8 下汉字为什么需要三个字节

    Unicode 十六进制码点范围 --> UTF-8 二进制0000 0000 - 0000 007F --> 0xxxxxxx 0000 0080 - 0000 07FF --> ...

  3. idea 中使用 出现 svn: E155036

    在idea中使用svn  checkout时  svn出现如上错误. 原因本地的工作副本太旧.command line进入本地工作副本的根目录,执行svn upgrade后 重启idea就可以了.

  4. js总结(三):面向对象,prototype ,oo模拟

    http://aralejs.org/class/docs/competitors.html http://javascript.crockford.com/prototypal.html proto ...

  5. python的unittest单元测试框架断言整理汇总

    自动化脚本最重要的是断言,正确设置断言以后才能帮助我们判断测试用例执行结果. 一.先说说unittest常用的断言吧 常用的就以下几个,网上一搜一大堆.python版本2.7以上都可以调用了. 断言语 ...

  6. functools内置装饰器

    def update_wrapper(wrapper, wrapped, assigned = WRAPPER_ASSIGNMENTS, updated = WRAPPER_UPDATES): def ...

  7. C# 中的新增功能

    百度搜索:C# 中的新增功能 微软有站点专门介绍:C# 中的新增功能. 地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/inde ...

  8. nginx1.6.3

    Nginx1.6.3安装配置 安装时关闭防火墙和selinuxservice iptables stopsed -i "s/selinux=enabled/selinux=disable/g ...

  9. 七牛云赵之健:多维度融合赋能视频 AI 的实践

    6 月 30 日下午,赵之健在七牛架构师实践日第二十九期进行了<多维度融合赋能视频 AI 的实践>为题的实战分享. 
 作者简介: 
  赵之健,七牛人工智能实验室资深算法工程师, 七 ...

  10. HDU 5242 利用树链剖分思想进行贪心

    题目大意: 在给定带权值节点的树上从1开始不回头走到某个底端点后得到所有经过的点的权值后,这些点权值修改为0,到达底部后重新回到1,继续走,问走k次,最多能得到多少权值之和 这其实就是相当于每一次都走 ...