• 给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

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

  • 相关阅读:
    IPSec 传输模式下ESP报文的装包与拆包过程
    安装系统教程
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:按钮标签
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:禁用状态
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:激活状态
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:按钮大小
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:禁用按钮
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:按钮被点击
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:块级按钮(拉伸至父元素100%的宽度)
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:制作一个超小按钮
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6852182.html
Copyright © 2020-2023  润新知