ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析

转载 2016年08月30日 17:24:30

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析

发生情况大概是我在ScrollView底部放了个GridView 来实现一个类似9宫格效果的展示.

Grid固定为2排,每排3个.固定为6个…所以没有性能问题,不需要重用,所以直接用GridView了..

只是为了方便和数据对应处理.

然后出现的状况是,当我获取完数据并调用notifyDataSetChanged();后 ScrollView自动滚到了最底部,也就是GridView所在的位置.

百度了一下,获取了一些解决方案

1、view.requestFocus(); 让界面顶部的某一个View获取focus
2、grid.setFocusable(false); 让Grid不能获得focus
3、手动scrollto(0,0)
4、重写ScrollView中的computeScrollDeltaToGetChildRectOnScreen,让该方法返回0目前简单的用

setFocusable(false)解决了该问题(亲测可用)

分析一下这个问题产生的原因. 从解决方案反推,这个问题产生和 focus有关系

一个猜测是 notifyDataSetChanged()之后,grid由于加载了数据的关系高度产生了变化

这导致了ScrollView内部重新走了 onLayout / onMeaure 流程 在这个流程中 ScrollView会将自身滚动到 获得 focus 的 child 位置上面关于focus的解决方案即是从这个角度去解决问题

手动scrollto(0,0)是个比较烂的办法

而重写ScrollView中的computeScrollDeltaToGetChildRectOnScreen跟踪一下调用链

protected void onLayout(boolean changed, int l, int t, int r, int b) {
 super.onLayout(changed, l, t, r, b);
 mIsLayoutDirty = false;
 // Give a child focus if it needs it
 if (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) {
 scrollToChild(mChildToScrollTo);
 }
 ...
}

可以看到 onLayout 的时候确实会将ScrollView滚动到focus child位置

private void scrollToChild(View child) {
 child.getDrawingRect(mTempRect);

 /* Offset from child's local coordinates to ScrollView coordinates */
 offsetDescendantRectToMyCoords(child, mTempRect);

 int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);

 if (scrollDelta != 0) {
 scrollBy(0, scrollDelta);
 }
}

而scrollToChild会根据computeScrollDeltaToGetChildRectOnScreen的返回值来计算滚动的位置

重载computeScrollDeltaToGetChildRectOnScreen让其返回0 会导致ScrollView内布局产生变化时,不能正确滚动到focus child位置

当然你不需要这个功能的话 重载computeScrollDeltaToGetChildRectOnScreen也可以

至于computeScrollDeltaToGetChildRectOnScreen代码太长就不贴了

大致是 根据当前 scrollY和focus child 的 rect.bottom 去计算要滚到哪

逻辑理顺以后觉得这个问题也没什么奇怪的.

现在还剩个问题 不是很明白GridView为何会默认获得focus

转自:http://www.tuicool.com/articles/yYvIJn

相关文章推荐

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析 发生情况大概是我在ScrollView底部放了个GridView 来实现一个类似9宫格效...

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决办法

ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析 发生情况大概是我在ScrollView底部放了个GridView 来实现一个类似9宫格效果的...

android Scrollview里的内容不停留在顶部的问题

先说明一下:任何一个页面都应该按照布局的先后顺序来显示,我这出现的问题就是,Scrollview里面嵌套Listview的头布局一进来看不见了,直接被Listview把焦点给抢了。最先显示的是List...

关于ScrollView中嵌套Listview和GridView的解决方案

网上有一个是在setAdapter()后去计算item的高度来解决的! 代码 public void setGridViewHeightBasedOnChildren(GridView gridVi...

ScrollView嵌套ListView或GridView等,使得其高度自适应解决方案

这类的文章有很多,写此文的目的是为了备忘吧。ScrollView里面嵌套ListView或GridView等,两个View都有滚动的效果,在嵌套使用时起了冲突,一般不建议两者套用。解决的方案有很多但是...
  • wzgbgz
  • wzgbgz
  • 2017年07月31日 09:03
  • 307

ScrollView嵌套ListView,gridView只显示一行解决方案 (以及计算显示高度错误问题)

今天遇到问题如题:               最后通过网络找到答案,,,主要是ScrollView问题,,,所以贴出来大家一起共同学习.            解决方法1:(代码去计算高度,然后...

Android ScrollView中嵌套ListView和GridView显示不全解决方案

在ScrollView中嵌套ListView时,ListView只能显示一行多一点.,下面介绍几种方法: 方案一   这是一个简单有效的方法,推荐使用 经过验证,简单有效的方法,在listview...
  • pcaxb
  • pcaxb
  • 2015年07月21日 21:45
  • 1215

ScrollView中嵌套ListView与GridView时滑动冲突解决方案

ScrollView嵌套ListView与GridView时的滑动冲突解决方案,对于刚入门的我可能写的不齐全,但是很有效。在以后的工作中遇到的问题我会都写出来与大家分享。...

解决ScrollView中有listView,造成不屏幕不停留在顶端的问题

这个问题造成的原因 其实是加载ListView之后  ScrollView 的焦点异常   然后看上去被顶上去的 其实有两个方法可以解决 这个问题  一个是 scrollView.smo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析
举报原因:
原因补充:

(最多只允许输入30个字)