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

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

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

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

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

ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题_第1张图片

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

此属性是viewGroup的属性

ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题_第2张图片

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

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

 

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

此方法的主要作用是用来计算子View们的高度,当listView中的数据在view绘制完成后再获取到数据并刷新adapter后,包裹它的scrollView会执行onSizeChanged方法ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题_第3张图片

子类实现:

ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题_第4张图片

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

ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题_第5张图片

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

 

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

你可能感兴趣的:(杂七杂八)