设置RecyclerView的高度

在使用RecyclerView的时候,碰到一个这样的问题:RecyclerView只显示一个item,多出来的item需要滑动才能显示。但是我们想一下子显示所有的item, 这种情况下需要将RecyclerView的高度确定为一个固定的值,那怎么来确定其高度呢?

我们知道RecyclerView需要setLayoutManager来对其进行layout的设定,如显示列表还是表格等。显示列表的LinearLayoutManager和显示表格的GridLayoutManager都是继承自LayoutManager,它们自身没有实现onMeasure方法,onMeasuer的具体的实现是在LayoutManager里面实现的。那就让我们看看LayoutManager的onMeasure方法是怎么实现的吧:

1
2
3
public void onMeasure(Recycler recycler, State state, int widthSpec, int heightSpec) {
mRecyclerView.defaultOnMeasure(widthSpec, heightSpec);
}

原来是调用了mRecyclerView.defaultOnMeasure方法,继续追踪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Used when onMeasure is called before layout manager is set
*/
void defaultOnMeasure(int widthSpec, int heightSpec) {
// calling LayoutManager here is not pretty but that API is already public and it is better
// than creating another method since this is internal.
final int width = LayoutManager.chooseSize(widthSpec,
getPaddingLeft() + getPaddingRight(),
ViewCompat.getMinimumWidth(this));
final int height = LayoutManager.chooseSize(heightSpec,
getPaddingTop() + getPaddingBottom(),
ViewCompat.getMinimumHeight(this));

setMeasuredDimension(width, height);
}

可以看到defaultOnMeasure方法获取了一个高度和一个宽度,既然RecyclerView只显示一行,那这个高度肯定就是一个item的高度了。我们只需要改一下这个高度就可以让所有的item都显示出来了。

下面我们需要自定义一个LinearLayoutManager,将设定的高度定义为item的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MyLayoutManager extends LinearLayoutManager {
public RescueLayoutManager(Context context) {
super(context);
}


@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
final int width = RecyclerView.LayoutManager.chooseSize(widthSpec,
getPaddingLeft() + getPaddingRight(),
ViewCompat.getMinimumWidth(mList));
final int height = RecyclerView.LayoutManager.chooseSize(heightSpec,
getPaddingTop() + getPaddingBottom(),
ViewCompat.getMinimumHeight(mList));
setMeasuredDimension(width, height * mTelList.size());
}
}

将其设置到RecyclerView中后看一下效果: