Android每日一题:如何解决ScrollView嵌套中一个ListView的滑动冲突?

本文探讨了在Android中如何解决ScrollView嵌套ListView时的滑动冲突问题,分析了ScrollView和ListView的测量过程以及MeasureSpec的作用。通过重写ListView的onMeasure方法并理解ViewGroup的Touch事件分发机制,可以实现滑动事件的正确处理。同时,文章提到了requestDisallowInterceptTouchEvent方法在解决事件冲突中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去新成立了研发中心面试,面试官很和蔼的和我讨论了一些技术问题,大多数还能应付,记忆较深的便是如何处理嵌套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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值