ListView和RecyclerView中item中宽度不占满的一种可能

ListView和RecyclerView中item中宽度不占满的一种可能

十月 25, 2017

ListView和RecyclerView中item中宽度不占满的一种可能

开发中遇到一个问题,用到一个简单的ListView,我在item里写了match_parent属性,但是在运行中却并没有占满一整行,就导致了布局有问题。

在使用ListView的Adapter中,我们在getView方法里是这样的写的:

1
2
3
4
5
6
public View getView(int position, View convertView, ViewGroup parent) {   
if (convertView == null) {
convertView = inflate(R.layout.item_lv_test, null);
}
return convertView;
}

其中的第二个参数是放parent,通常情况下之前一直在用null,但是这次却行不通了。问题在其实还真就在于这个null上。

点进去去看了下源码,发现inflate里还有一个方法。

查阅资料,发现了我代码的问题。

1.如果设置为null:

根布局设置的高度是不起作用的,即使根布局是一个控件,比如:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>

<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="abc" />

这时200dp不起作用,而是根据里面的文字大小来决定item的高度,比如如下起作用:

1
2
3
4
5
6
<TextView 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp"
android:text="abc"
android:textSize="200dp" />

根布局是一个layout的情况下,根布局的高度也不起作用,而是里面子控件的高度起作用,比如下面item的高度是100dp:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="300dp">

true<TextView
trueandroid:layout_width="match_parent"
trueandroid:layout_height="100dp"
trueandroid:text="abc"/>

</RelativeLayout>

如果里面的内容设置为match_parent,效果跟第一个一样,根据文字大小来决定item高度,因为parent设置的高度没用,所以里面子空间match_parent也没用:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="300dp">
true<TextView
true android:layout_width="match_parent"
true android:layout_height="match_parent"
true android:text="abc"/>

</RelativeLayout>

对传null总结:

设置为null时,因为没有父亲,根布局的layout_height没有作用,子布局的layout_height为绝对值时有用,为相对值(match_parent,wrap_content)时没用,里面内容的高度决定了item的高度(根部局为普通空间时,控件内容决定item高度,根布局为layout时,子控件设置的绝对高度或子控件的内容决定item高度)

2.如果传入三个参数##

如果parent设置为getview传入的parent(第三个参数false),则根布局设置的高度就有用了:

比如上面第一个就是200dp了

如果这时候,根部局设置为match_parent,则根据里面内容来适配,比如以下item高度跟上面第一个一样,为文字的高度:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
trueandroid:layout_width="match_parent"
trueandroid:layout_height="match_parent">
true<TextView
trueandroid:layout_width="match_parent"
trueandroid:layout_height="match_parent"
trueandroid:text="abc"/>

</RelativeLayout>

以下高度变成了200dp:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
trueandroid:layout_width="match_parent"
trueandroid:layout_height="match_parent">
true<TextView
trueandroid:layout_width="match_parent"
trueandroid:layout_height="200dp"
trueandroid:text="abc"/>

</RelativeLayout>

同样这个在RecyclerView中也是,总结起来是自己当初用的时候太过着急没仔细看看这个方法是什么用的。以此来记录这次小坑。