ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题

文章参考:https://blog.csdn.net/xiaoluoli88/article/details/54576058

ScrollView嵌套listView时 会自动滚动到listView最后一条数据网上解决办法有三条
1:在ScrollView里面的第一个View 添加如下两句获取焦点来达到目的,但是也有可能出现无效的情况

如果无效可以看下第2种加强版的方法

android:focusable="true"
android:focusableInTouchMode="true"

2:在listView的父层加上  android:descendantFocusability="blocksDescendants"

此属性是viewGroup的属性

设置此视图组的后代可聚焦性。这样可以在requestFocus中查找焦点视图时定义此视图组与其后代之间的关系

FOCUS_BLOCK_DESCENDANTS(blocksDescendants):对应的属性的意思:这个视图会阻止它的任何后代获得焦点,甚至如果它们是可聚焦的。
FOCUS_AFTER_DESCENDANTS:只有在没有后代需要焦点的情况下,此视图才会获得焦点。
FOCUS_BEFORE_DESCENDANTS:该视图将在其任何后代之前得到关注。

 

3:重写ScrollView的computeScrollDeltaToGetChildRectOnScreen方法直接Reutin 0即可

此方法的主要作用是用来计算子View们的高度,当listView中的数据在view绘制完成后再获取到数据并刷新adapter后,包裹它的scrollView会执行onSizeChanged方法

子类实现:

当列表更新后就会调用到此方法,子view中的代码会将界面定位到新的需要显示数据的地方去,造成了显示在listview的位置

computeScrollDeltaToGetChildRectOnScreen方法主要是对绘制界面的rect设置高度,所以当重写这个方法返回0后,在onSizeChanged中便不会滚动到listView的位置去
 

 

这种嵌套方式对于界面复杂的app可能都有遇到,解决方案也比较成熟。方法1和2主要是从焦点入手,方法1不一定会生效,如果item中有特殊的关于焦点的需求可能导致焦点之间的异常或冲突方法3直接简单粗暴,但是会对定位到某子元素位置的需求有影响,所以这几个方案根据自己需要选择,如果很不幸的这三个都不能满足,可以考虑下界面加载完成后手动执行代码让scrollView滑动到0位置

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值