给GridView设置行高

近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来.

遇到的问题:

1.把item中的宽和高设置match_parent,还是设置成wrap_content,当内容过多的时候,会覆盖下一行的显示的内容.

2.没有一个属性能够给GridView设置行高,那么高度就不能控制.

遇到的问题展示:.期望

想到的解决的方法是:

设计思路: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

大家互相探讨,互相进步.

时间: 2024-11-07 15:27:06

给GridView设置行高的相关文章

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

MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了.但是作者提供的代码没有设置行高 要实现这个效果,首先需要修改两个文件: 1.Row.cs 添加行高的属性. private ushort _rowHeight;   /// <summary> /// Gets the row index of this Row object. /// </summary> public ushort RowHeight { get {

DataGridView设置行高

.Net中DataGridView控件如何设置行高 在DataGridView控件中,默认的行高很大,而标题头的行高却很小,感觉很不匀称. 标题头的行高比较好设置需要修改两个属性1修改ColumnHeadersHeader 设置为你想要的高度,比如20:但这时候自动变回来.2修改ColumnHeadersHeaderSize属性为 EnableResizing,不要为AutoSize.行高的设置:RowTemplate属性下的Height 属性. 其实.Net设置的很完美了,就是有的属性不容易找

自绘ListCtrl -- 设置行高

以下是通过重载DramItem()方法来实现自绘, 故需要设置ListCtrl控件属性"Owner Draw Fixed"为TRUE,"Owner Data"为FALSE(默认为FLASE); 1.  准备工作 (1).新建一个MFC类CMyListCtrl,其基类为CListCtrl, (2).将ListCtrl控件属性"Owner Draw Fixed"设置为TRUE,"Owner Data"设置为FALSE(默认为FLA

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

在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font-size:14px; padding:0px 0px 0px 30px; [;line-height:1;color:#f00;] } 单独针对Safari来写hack 原文地址:https://www.cnblogs.com/guoliping/p/9798703.html

iOS UILabel 设置行高

UILabel *tileLabel = [[UILabel alloc] init]; tileLabel.numberOfLines = 0; tileLabel.backgroundColor = [UIColor clearColor]; tileLabel.text = @"调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整

给博客园的博客文章设置行高,让博客文字不再拥挤

若使用博客园模板的默认样式,文字是相当拥挤的.如下图: 解决办法: [1]点击导航下的[管理] [2]进入后台界面后,点击[设置] [3]进入设置界面后,找到[页面定制CSS代码],并进行如下输入: #cnblogs_post_body p { line-height: 2; } [4]代码输入完成后,在页尾处找到[保存],并点击 [5]处理之后,文字终于有了行高. [6]当然,还可以通过控制台查看标签,进行进一步的样式设置. 但如果仅要求增加文章行高的话,就是以上操作……

常规问题(标签默认边距,文字设置行高)

1.body标签存在默认的margin:8px; 其他的标签也会在不同的浏览器中存在默认的margin,padding,所以在进行页面开发是需要在css中将可能用到的标签重置默认值: margin:0,:padding:0; 2.容器定义了height之后,容器边框的外形就确定了,不会被内容撑大,不要轻易给容器定义height.(网上说ie会被内容撑开,实验后仍旧是不会被撑开)

不设置行高,文字水平垂直居中显示

利用display:table-cell; 表格 <body> <div class="box">爆款推荐</div> <br/> <div class="box">满199减20</div> <br/> <div class="box">满赠</div> </body> .box { width:60px; height:60

Gridview 单选效果实现,且用且珍惜

Gridview 单选效果,在androidapp中实现非常频繁,我这里提供我的一种思路,这是我的思维导图: 怎么样将这样的思维导图翻译成java代码了,请看下面的代码了: // 电子产品的图片列表信息 static class ConfigInfo { static final int[] img = { R.drawable.electron_dvdplay, R.drawable.electron_toudaishishexianji, R.drawable.electron_miniyi