ListView item设置layout_height无效问题

以前在使用listview设置item高度时不知道为什么总是没有效果最后只能设置内部控件大小加内外边距来控制item的高度,今天无意中看到关于LayoutInflater问题时里面有提到原因。

在使用listview时我们都会使用到adapter的getView 这里就会使用LayoutInflater.inflate来加载我们的item文件,以前都是像下面这样写的,不管怎样设置item的高属性都没有效果无耐只有换种思路实现,俗话说条条大路通罗马这是我们程序猿应该具备的精神,但又曾思考过为什么设置没有效果,goolge不会犯如此低级问题吧!终究还是我们自己研究不够透彻,其实api早就已经有埋伏了,这时我们就要在LayoutInflater上面动手了。

<span style="font-family:Microsoft YaHei;font-size:18px;">public View getView(int position, View convertView, ViewGroup parent) {  
    if (convertView == null) {  
        convertView = inflate.inflate(R.layout.item_row, null);  
    }  
    return convertView;  
}  </span>

首先,LayoutInflater这个类是用来干嘛的呢?

我们最常用的便是LayoutInflater的inflate方法,这个方法重载了四种调用方式,分别为:

1. public View inflate(int resource, ViewGroup root)

2. public View inflate(int resource, ViewGroup root, boolean attachToRoot)

3.public View inflate(XmlPullParser parser, ViewGroup root)

4.public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot)

这四种使用方式中,我们最常用的是第一种方式, inflate方法的主要作用就是将xml转换成一个View对象,用于动态的创建布局。虽然重载了四个方法,但是这四种方法最终调用的还是第四种方式。第四种方式也很好理解,内部实现原理就是利用Pull解析器,对Xml文件进行解析,然后返回View对象。

inflate方法有三个参数,分别是

1.resource布局的资源id

2.root指出视图结构中载入的布局将要放入的根视图

3.attachToRoot用来决定是否把载入后的视图绑定到给出的根视图中


 具体详细的解析就不做了有兴趣的可以看看下面地址的博客

认识LayoutInflater关注下本文的XmlResourceParser


activity_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:background="@android:color/darker_gray"  
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="11"
        android:textColor="@android:color/black"
        android:textSize="22sp" />
    
	 
</LinearLayout>

TwoActivity 该item显示的高度就是50dp,如果convertView = inflater.inflate(R.layout.activity_list_item, null);item就会像我之前描述的那样只能通过内部控件支撑高度

package com.test.listitem;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.test.R;

public class TwoActivity extends Activity {
	private ListView list2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_one);
		list2 = (ListView) findViewById(R.id.list1);
		list2.setAdapter(new MyAdapter(this));
	}

	private class MyAdapter extends BaseAdapter {

		private LayoutInflater inflater;

		MyAdapter(Context context) {
			inflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			return 20;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			if (convertView == null) {
				convertView = inflater.inflate(R.layout.activity_list_item, parent,false);
			}
			TextView tv = (TextView) convertView.findViewById(R.id.tv);
			tv.setText(position + "");
			return convertView;
		}

	}

}

本人没什么文采那里不当的请指教,已亲自验证过。
















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值