去新成立了研发中心面试,面试官很和蔼的和我讨论了一些技术问题,大多数还能应付,记忆较深的便是如何处理嵌套ListView的滑动事件冲突问题。
这个问题当时我没有回答好,主要是我对自定义View方面经验不足,Touch事件的分布机制也没有理解清楚。之后并没有给我答复,到是过了两个月HR再次联系我,问我如果过去的话什么时候能到岗,并强调他们是由于公司投资的手绪问题拖了这么久。
只能感叹能否进某家公司其实也是需要缘分的。我当时对在本地的公司已经不感兴趣了,因为“世界这么大,我想出去看看”。
面试题:如何解决ScrollView嵌套中一个ListView的滑动冲突?
后来我一试,发现ScrollView布局中嵌套Listview显示是不正常的,确切地说是只会显示ListView的第一个项。
先说下为什么会只显示ListView的第一个Item,简单的说就是ListView在计算(比较正式的说法是:测量)自己的高度时对MeasureSpec.UNSPECIFIED这个模式在测量时只会返回一个List Item的高度(当然还有一些padding这些的值我们可以先忽略),而ScrollView的重写了measureChildWithMargins方法导致它的子View的高度被强制设置成了MeasureSpec.UNSPECIFIED模式。
ListView.java的onMeasure()代码片段:
if (heightMode == MeasureSpec.UNSPECIFIED) {
heightSize = mListPadding.top + mListPadding.bottom + childHeight +
getVerticalFadingEdgeLength() * 2;
}
ScrollView.java的measureChildWithMargins()代码片段:
final i