在网易遇到的一个面试题,关于下拉刷新的

fso918 2014-10-22 09:38:47
问题是:
你实现下拉刷新的时候,会在ListView的头部显示一个刷新的提示,这个提示是一个View对象,那么问题来了,这个View是怎么弹出来的?即这个View怎么实现随着你的手指下拉,而显示出来?
我回答的是:
用不停更改View的属性即LayoutParams这种方式实现的。可以更改控件的高度,也可以修改Margin属性实现。
面试人说:
这样做是可以实现效果,但这样做事效率最低的,更改属性会引起界面重绘什么的。
那么问题是:
还有什么其他方式可以实现这样的效果吗?怎么实现,才能使ViewTree不会重新onMeasure,onLayout,有大神知道么?

照我的理解,这个提示的View出现的方式本身是一种动画效果,即使不需要重新onMeasure,但是他的出现肯定改变了ListView里面的元素的位置,即onLayout肯定会被执行的吧。
已我的理解,只有在Scorll滚动View的时候,才不会触发onMeasure,和onLayout,而只会执行performDraw方法。

我们的问题是:挖掘机技术哪家强?
...全文
519 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gqjjqg 2014-10-23
  • 打赏
  • 举报
回复
貌似listView源码里有 自带的下拉过头回弹的代码,把源码稍微改造一下就是一个原生支持此特效的listView控件。 这样不会改变listView以外的布局,也不会引起外部的onLayout 和measure。
Birds2018 2014-10-23
  • 打赏
  • 举报
回复
scroll To 或者 scroll By 这种组件滚动效果。
SeVen.Shang 2014-10-23
  • 打赏
  • 举报
回复
这个问题你解决了吗?可以跟我说说嘛!shangyufeng515@yeah.net
哎,真难 2014-10-23
  • 打赏
  • 举报
回复
蓝翔老师告诉你,你应该看一下pulltorefresh的源码
ll814216157 2014-10-23
  • 打赏
  • 举报
回复
看了下下拉刷新的代码,也是继承linearlayout,不过滚动的时候操作是先设置头部view为VISIBLE(默认为INVISIBLE),然后调用linearlayout的scrollTo方法
fso918 2014-10-22
  • 打赏
  • 举报
回复
引用 6 楼 kifile 的回复:
如果那样,你要怎么处理 ListView 本身的活动事件,毕竟 ListView也是可以滑动的,使用一个滑动的 View 包裹另一个可滑动的 View, 本身就需要计算很多东西,而且麻烦
是啊,不知道该怎么弄啊?
Kifile 2014-10-22
  • 打赏
  • 举报
回复
如果那样,你要怎么处理 ListView 本身的活动事件,毕竟 ListView也是可以滑动的,使用一个滑动的 View 包裹另一个可滑动的 View, 本身就需要计算很多东西,而且麻烦
dingding_tmp 2014-10-22
  • 打赏
  • 举报
回复
scrollTo ?
fso918 2014-10-22
  • 打赏
  • 举报
回复
引用 3 楼 kifile 的回复:
界面在滚动的时候也有重绘好吗?
滚动的时候不会执行perforMeasure和performLayout把,因为每个View的大小和位置都没变化。所以只需要在performDraw的时候考虑mScrollY就行了的
Kifile 2014-10-22
  • 打赏
  • 举报
回复
界面在滚动的时候也有重绘好吗?
fso918 2014-10-22
  • 打赏
  • 举报
回复
引用 1 楼 kifile 的回复:
如果 listview 自身有移动,那么必然会造成界面的重绘, 而如果不让界面重绘,那么只能让下拉提示改一个位置,不知道你有没有使用过知乎,知乎里面的刷新提示是放在了 Actionbar 的位置进行提示的,所以我们可以通过检测在 listView 中的下拉手势,通知 actionbar, 显示对应的下拉提示,这样只需要重绘 actionbar 部分
面试的那个人的意思是有方法不让界面重绘实现这种效果,我能想到的是在外面套个View,然后让这个View的内容滚动,从而不用重新计算,不知道这样行不行,这种我也没实现过。
Kifile 2014-10-22
  • 打赏
  • 举报
回复
如果 listview 自身有移动,那么必然会造成界面的重绘, 而如果不让界面重绘,那么只能让下拉提示改一个位置,不知道你有没有使用过知乎,知乎里面的刷新提示是放在了 Actionbar 的位置进行提示的,所以我们可以通过检测在 listView 中的下拉手势,通知 actionbar, 显示对应的下拉提示,这样只需要重绘 actionbar 部分

80,360

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧