近期在工作中遇到了这样一个问题,使用一个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. 任务备忘(已经完成):用python写一个格式化xml字符串的程序

    功能: 1.将xml中多余的空格,换行符去掉,让xml字符串变成一行. 2.将xml中添加缩进,使用print能正确打印添加缩进后的字符串. 思路: 采用正则表达式来判断xml中字符串的类型: 1.文 ...

  2. transformer模型解读

    最近在关注谷歌发布关于BERT模型,它是以Transformer的双向编码器表示.顺便回顾了<Attention is all you need>这篇文章主要讲解Transformer编码 ...

  3. MySQL学习点滴 --分区表

    写在前面:笔者之前也有一些MySQL方面的笔记,其中部分内容来自极客时间中丁奇老师的课程.后经园友提醒,这个做法确实不太好.之后我仍会继续更新一下MySQL方面的学习记录,在自己理解之后用自己的方式记 ...

  4. Golang 编写 Tcp 服务器

    Golang 作为广泛用于服务端和云计算领域的编程语言,tcp socket 是其中至关重要的功能.无论是 WEB 服务器还是各类中间件都离不开 tcp socket 的支持. Echo 服务器 拆包 ...

  5. jQuery中attr和prop方法的区别

    jQuery中attr和prop方法的区别。 http://my.oschina.net/bosscheng/blog/125833 http://www.javascript100.com/?p=8 ...

  6. xtu字符串 C. Marlon's String

    C. Marlon's String Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java ...

  7. Android CircleImageView圆形ImageView

     Android CircleImageView圆形ImageView CircleImageView是github上一个第三方开源的实现圆形ImageView的项目.其在github上的项目主页 ...

  8. HDU-1232/NYOJ-608畅通工程,并查集模板题,,水过~~~

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) http://acm. ...

  9. poj2446 Chessboard 【最大匹配】

    题目大意:一个n*m的棋盘,某些格子不能用,问用1*2的骨牌能否完全覆盖这个棋盘,当然,骨牌不能有重叠 思路:显然黑白染色后,一个骨牌只能覆盖一个白色格子和一个黑色格子,然后我们间二染色建图,看能否有 ...

  10. centos 6.5 yum安装lnmp

    转自:http://blog.csdn.net/lane_l/article/details/20235909 准备篇: 端口 vi /etc/sysconfig/iptables -A INPUT ...