原因分析流程参考:
通过上面的文章我们知道了为什么会出现这种情况。原因是第一项被隐藏了,但是recyclerView还是计算了它的高度。那么知道了原因我们就可以想办法解决这个问题:
方法1、上面文章所说的方案
方法2、在第一项的要隐藏的地方设置一个0.01dp大小的View。然后隐藏其它的View即可。
方法3、在recyclerView外层套一个ViewGroup。但是这种解决方案可能在部分情况下会出问题。至于为什么可以这么做,我们就需要知道SwipeRefreshLayout是怎么实现下来刷新的,具体的分析文章可以网上找一下别的大佬写的文章。我这边大概说下,SwipeRefreshLayout会找到自己的子View判断子View是否可以向上滑动,再决定是否把事件交给自己处理。
public boolean canChildScrollUp() {
//这边是有设置ChildScrollUpCallback的时候才会回调,具体可以看一下那边的源码
//大致的意思是,设置这个callback的时候,将canChildScrollUp交给开发者自己处理
if (mChildScrollUpCallback != null) {
return mChildScrollUpCallback.canChildScrollUp(this, mTarget);
}
//这边是处理ListView
if (mTarget instanceof ListView) {
return ListViewCompat.canScrollList((ListView) mTarget, -1);
}
//这边是核心代码
return mTarget.canScrollVertically(-1);
}
经过上面的分析,大致知道我们在recyclerView外层套一个ViewGroup的原因,修改代码如下所示:
总体来说问题还是比较简单的,只要我们看了上面大佬分析为什么会出现这种情况的文章,问题就迎刃而解。
突然验证一句话,看源码是用来解决问题,熟悉源码可以让你更快的解决问题。不至于让你浪费太多时间。