最近在工作中遇到了这样一个问题,使用一个GridView展示数据,item中只是一个TextView,但是里面显示的文字多少不固定多少,必须全部展示出来.
遇到的问题:
1.把item中的宽和高设置match_parent,还是设置成wrap_content,当内容过多的时候,会覆盖下一行的显示的内容.
2.没有一个属性可以给GridView设置行高,那么高度就不能控制.
遇到的问题展示:
.期望
想到的解决办法是:
设计思路:1.先把TextView的高度,获取出来
2.把高度存到全局变量中,然后进行和原来的比较,把大的存到全局变量中
现在明白了思路,下面就开始理解代码.
先创建一个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的高度,如果想了解其他动态方法,请点击
大家互相探讨,互相进步.