最近项目中碰到一个很奇怪的问题,在一个带ListView的界面上滑动的时候,偶现ListView顶部出现一根1px的线,线的颜色跟ListView的背景色一样。下图是我用demo还原这个bug后截的图,为了方便大家看清楚,把这根线变粗了。
这个界面的布局如下:
看到这个问题你觉得可能的原因会是什么?因为笔者的项目ListView支持下拉刷新,怀疑是不是因为下拉刷新后没有回弹到位。用hierarchyviewer.bat分析后,排除这个原因。又怀疑是不是因为硬件加速导致的,禁用掉这个activity的硬件加速后问题依旧,这个原因也排除了。暂时也没有其他怀疑的对象了,于是再次打开UI神器hierarchyviewer.bat,这次发现了一个惊天的秘密,尼玛这个ListView居然不是原生的ListView,而是自己重写的,打开代码一看,仅仅只是重写了overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)这个方法,实现如下:
项目里返回的是1,这里为了放大这根线改成了10。直觉告诉我应该是这里的问题了,把1改成maxOverScrollY后验证,问题完美解决!果然是这货导致的。那是不是就结束了呢?当然不是,如果你也跟笔者一样,不了解overScrollBy是干嘛用的,建议打开源码或者API文档熟悉一下。这里笔者卖个关子就不介绍了。
题外话,这个问题比较特殊,是因为重写ListView导致的,大部分读者应该不会碰到这种问题。但碰到这种问题后应该如何去分析呢?如果你有更好的思路也可以给笔者留言,一起探讨。大家如果在平时的工作中有碰到什么棘手难搞的问题也可以给笔者留言,一起探讨。