1.起因
最近一个项目中,有一个需求是要在ScrollView中嵌套好几个RecyclerView。然后问题来了,五个RecyclerView(PS:设计太奇葩)中的第二个RecyclerView总是只显示一行数据。这个问题和以前ScrollView嵌套ListView很像,估计是一样的问题。
2.原因
在ScrollView中嵌套嵌套ListView空间,无法正确的计算ListView的大小。但是这里有一点没想明白的是,我嵌套了几个RecyclerView,只有第二个RecyclerView会出现只显示一条数据的情况,其他几个RecyclerView都能正常运行。
3.解决办法
重写RecyclerView的onMeasure方法
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthSpec, expandSpec);
}
首先是Integer.MAX_VALUE,32位数,结构如下:
Integer.MAX_VALUE的前两位存储的是测量模式,后面的数据才是大小值,也就是2147483647,基本就是无限大小。
然后是测量模式:
MeasureSpec.EXACTLY:精确模式,当设置了宽/高为50dp这种指定值或者为match_parent/fill_parent时就是这种模式。父元素确定了子元素的大小。
MeasureSpec.AT_MOST:最大(至多)模式,在这里设置为了Integer.MAX_VALUE>>2=2147483647,也就是最大不超过这个值,可以小于。
MeasureSpec.UNSPECIFIED:未指定模式,可以得到任意想要的大小。
总结:重写Listview/RecyclerView的onMeasure方法,通过最大测量模式得到值为Integer.MAX_VALUE>>2的值,将该值设为Listview/RecyclerView的高度,因为这个数值很大,因此可以直接将Listview/RecyclerView的内容全部显示完。
缺点:使用这种方式虽然解决了问题,但是当Listview/RecyclerView的数据量很大的时候,会导致数据一次加载完,失去了Listview/RecyclerView复用的优势。