Scrollview中嵌套recyclerview时,如何获得recyclerview的总高度?不然外层的scrollview没什么用
你获得是计算的实际高度还是有问题的高度,我们知道,scrollview嵌套listview、gridview之类的有问题,所以如果你需要计算recycleview的高度,就需要知道
item的个数与item的高度,然后计算得出
我个人意见,相对于嵌套来说,如果是listview的话不如用添加header和footer用起来方便,recyclerview的话也可以添加header,只不过不像listview有原生方法那么方便,另外也可以考虑运用多布局来完成,也很方便。。。
RecyclerView或者ListView等在页面加载后除非外部条件发生改变重新设置其高度,否则他们的高度将一直和加载的时候一致,其实现机理并不是
为每个item都设定一个新的ViewItem,而是根据其界面上可能用到的item个数,初始化对应个数的itemView,然后之后当滚动的时候,只是把数
据条目按照滚动方向移动并显示到与之对应的item上。这样就可以在使用最少的View的情况下显示最多的数据。既能节约内存,又能提高响应速度。
所以从上可以看出,List这一类的控件,是在有限的空间上,按需供应内容。好比商铺,他只有一个窗口给你,你也只能看到一个窗口。只有你想看的东西才会摆到窗口上,暂时不想看的都放到了后院的仓库里。
而ScrollView则是所有View全加载的。所以在ScrollView不适合显示List一类的东西。因为这会非常耗内存。
从上可以看出,如果ScrollView内套入ListView后,ListView的大小除非外部强制改变其大小,否则不会改变,也就是说ListView的高度不会因为其内部View发生改变而发出请求让ListView调整大小。ListView只会说地盘就这么大了,显示不下的内容,就不要显示了。
而ScrollView等其它大部分View在设置恰当的参数的时候,如果自己内部要显示的内容需求更多空间的时候就会主动对parent请求,parent就会重新要求其下的所有View各自看看需要多大地盘,然后parent在根据一定的策略进行设定。
所以ScrollView中嵌套ListView火RecycleView后,指望它里面的内容增加了就主动对ScrollView请求地盘是不行的。
如果要部分固定内容可以跟着List条目一起滚动,那么可以根据情况考虑加header或者footer
小伙子,你是不是要做RecyclerView铺满屏幕呀?
获得到手机屏幕高度,再减去其他控件高度。剩下的就是RecyclerView的高度啦。
试着重写RecyclerView的onMeasure方法试试,
class MyRecyclerView extends RecyclerView {
public MyRecyclerView(Context context) {
super(context);
}
public MyRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
建议监听RecyclerView的addOnScrollListener后自己记录onScrolled的dy,
同时给adapter加个registerAdapterDataObserver,
监听插入/删除/移动,自己加减前面记录的dy滚动值。
具体思路就是获得每个item的高度,最后是根据获得item的数量乘以高度,等于把高度写死。至于获得item的高度是在setAdapter之后,用layoutManager.getHeight();获取,但这个方法有时候能获得准确的高度,有时候获取不到准确的,这个问题有待高人解答。