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宫格效果的...
  • DJS168888
  • DJS168888
  • 2015年11月05日 17:09
  • 952

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

发生情况大概是我在ScrollView顶部放了一个ViewPager用来做广告Banner,底部放了个GridVie, 来实现一个类似9宫格效果的展示. 然后出现的状况是,当我获取完数据并调用n...
  • richie0006
  • richie0006
  • 2016年03月04日 10:30
  • 609

ScrollView下嵌套GridView或ListView默认不在顶部的解决方法

当ScrollView下嵌套GridView或ListView时,如果内容超过一屏默认位置不在ScrollView的顶部,这是因为嵌套GridView或ListView获了焦点,解决方法有如下几种: ...
  • xiechengfa
  • xiechengfa
  • 2015年06月12日 22:45
  • 3231

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

原文地址:http://www.tuicool.com/articles/yYvIJn ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析 ...
  • myterabithia
  • myterabithia
  • 2016年02月26日 15:21
  • 231

ScrollView嵌套ListView、GridView,进入页面显示的位置并不是在最顶部,而是在中间部分问题

在Android项目的开发中,经常会遇到一些布局,可能需要在ScrollView中嵌套ListView或、GridView来实现,当然我们都知道ScroView中嵌套ListView、GridView...
  • mq2856992713
  • mq2856992713
  • 2016年12月18日 18:02
  • 1361

Android:完美解决ScrollView嵌套GridView

在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便会出问题,即GridView会显示不全。 解决办法,自定义一个GridView控件。...
  • yu75567218
  • yu75567218
  • 2016年09月01日 15:19
  • 377

Scrollview 嵌套 listview 或 gridview 导致 ScrollView默认不停留在顶部的解决方案和分析

转自:  http://www.tuicool.com/articles/yYvIJn ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析 发...
  • yxl503248523
  • yxl503248523
  • 2016年11月29日 14:52
  • 141

ScrollView嵌套GridView或者ListView的时候,页面自动滚动到GridView或者ListView所在位置的问题

问题描述:在一个页面中,最外层的根布局为ScrollView,里面嵌套着GridView,但是GridView并不是在整个布局的最顶端,而是布局到了整个页面的底部,在GridView上面还布局着其他控...
  • zhanzkw
  • zhanzkw
  • 2015年01月21日 17:19
  • 3852

在ScrollView中嵌套GridView,导致GridView不能滑动的问题

在Android开发中,有时根据需要,会在ScrollView中添加GridView,这问题也纠结了好一会,网上查的也对不上,如: ...
  • shockerjue
  • shockerjue
  • 2014年12月01日 11:14
  • 1374

Scrollview嵌套GridView的完美解决方案

最近在做项目的时候有一个效果给GridView上部添加一个ImageView,最初使用的是Scrollview嵌套ListView,对于这种做法就不过多说了,处理方法网上有很多,无非就是重写GridV...
  • zp_123578191
  • zp_123578191
  • 2015年07月06日 11:15
  • 406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析
举报原因:
原因补充:

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