给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 ...
随机推荐
- redis:哨兵集群配置
最少配置1主2从3哨兵 一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...
- 条款21:必须返回对象时,别妄想返回其reference(Don't try to return a reference when you must return an object)
NOTE: 1.绝不要返回pointer或reference 指向一个local stack 对象,或返回reference 指向一个heap-allocated对象,或返回pointer 或refe ...
- docker:安装tomcat
文章来源:http://www.cnblogs.com/hello-tl/p/8929879.html 0.下载镜像 # docker pull tomcat:8.5 1.复制tomcat配置 先启动 ...
- 如何将已经安装从chrome扩展程序导出备份为.CRX文件?
之前介绍过CRX Extractor可以从chrome应用商店下载备份扩展程序,有读者朋友问说:如果 Google Chrome扩展程序已经从 Chrome应用商店下架,还有没有方法下载呢?通常网路上 ...
- 利用virtualbox中的虚机制作主机启动盘
制作镜像的过程: 第一步:1.Windows下先下载安装virtualbox usb3.0驱动:https://download.virtualbox.org/virtualbox/5.2.20/Or ...
- 一个可以获取知乎timeline的爬虫
# -*- coding: utf-8 -*- import requests import lxml import os,time from bs4 import BeautifulSoup as ...
- Leetcode 297.二叉树的序列化和反序列化
二叉树地序列化和反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. ...
- 【数据传输 1】服务器—>客户端之间的数据类型转换
导读:在做项目的时候,在controller中,将List数据类型转换为了JSON字符串,那么,为什么要将其数据转换为JOSN呢?这样的转换是否是必须的,在这个转换过程中,又经过了那些步骤?注:本篇博 ...
- [codevs1050]棋盘染色 2
[codevs1050]棋盘染色 2 试题描述 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入 第一行一个整数N(<=100) ...
- 【区间筛】2017多校训练四 HDU6069 Counting Divisors
http://acm.hdu.edu.cn/showproblem.php?pid=6069 [题意] 给定l,r,k,求 d(n)是n的因子个数 [思路] [Accepted] #include&l ...