聊聊scrollview嵌套listview的问题
2016-05-31 21:51
267 查看
项目这几天需要修改主界面抛出来了一个让我dt的问题就是需要做到类似于美团外卖V4.47的列表那种效果而且要求有个筛选栏能够悬浮在顶部
回归正题 自然而然的我想到了scrollview嵌套一个listview列表
声明scrollview嵌套listview本身就是一件愚蠢的结构 十分不推荐这种结构,经过测试你完全可以使用listview加header 或者recycleview加header ok往下看
那么先说scrollview嵌套listview 吧
遇到的问题
1 ListView显示不全面
2.listview不能滑动
1解决方案:
在adapter中测量item高度并计算出总高度
传递机制大家可以参考点击打开链接这个讲解已经很详细了
ok问题到此为止当然问题不止这两个,还有很多 基本上全是坑 你可以想象下如果listview加上拉加载下拉刷新会是一个怎样WC的结构
会让你想超生不要问我怎么知道的
我接下来会告诉你为什么这种结构不推荐,下面转载的(之前测试在公司写的没存档)
ScrollView 如果一直滚动 他的整个长度其实是一直存在的
也就是说 你滚两屏 其实上一屏的数据还在,占用内存还在 只是你看不见了
这样问题来了
我们由于各种原因 在开发中不得不考虑ScrollView嵌套ListView
ListView是有自己的缓存机制 占用内存总是一屏幕
但是如果将ListView嵌套到ScrollView中 问题来了
我觉得ListView的缓存机制会失效 这样需求我们是达到了
但是数据很多的情况下 内存占用太大
甚至与OOM
特此做了一个测试 发现SCrollView嵌套ListView的时候所有的Item都是新建的 ListView的缓存机制失效了
所以在UI设计稿讨论的时候 我们必须要坚持 让设计师设计出来符合规范的设计稿 一般的ListView addhead就行
GIF.gif
顺带贴上内存图 会发现ScrollView里面的ListView之后内存暴涨
GIF.gif
现在看看RecycleView 替换ListView情况 看打印的log发现情况一致 ScrollView里面的缓存机制都失效
Paste_Image.png
所以在项目制定时期 千万要设计好不要有ScrollView嵌套ListView的相关需求
如果确实需要一些UI效果
比如 下图这样 可以考虑使用新控件CoordinatorLayout
文/Daemon1993(简书作者)
原文链接:http://www.jianshu.com/p/227c69308975
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果大家要用到这种可以考虑listview加header或者recycleview加header 新控件我也想用但是公司没给学习的机会 苦逼啊 而且大家可以参考开源项目地址如下https://github.com/Mrxyx/StickyHeaderListView
回归正题 自然而然的我想到了scrollview嵌套一个listview列表
声明scrollview嵌套listview本身就是一件愚蠢的结构 十分不推荐这种结构,经过测试你完全可以使用listview加header 或者recycleview加header ok往下看
那么先说scrollview嵌套listview 吧
遇到的问题
1 ListView显示不全面
2.listview不能滑动
1解决方案:
在adapter中测量item高度并计算出总高度
public class Utility { public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } }2解决方案
mWebView = (WebView)findViewById(R.id.new_mail_webview); mScrollView=(ScrollView) findViewById(R.id.scrollContent); mWebView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) mScrollView.requestDisallowInterceptTouchEvent(false); else mScrollView.requestDisallowInterceptTouchEvent(true); return false; } });关于onTouchEvent 需要了解android的时间传递机制
传递机制大家可以参考点击打开链接这个讲解已经很详细了
ok问题到此为止当然问题不止这两个,还有很多 基本上全是坑 你可以想象下如果listview加上拉加载下拉刷新会是一个怎样WC的结构
会让你想超生不要问我怎么知道的
我接下来会告诉你为什么这种结构不推荐,下面转载的(之前测试在公司写的没存档)
ScrollView 如果一直滚动 他的整个长度其实是一直存在的
也就是说 你滚两屏 其实上一屏的数据还在,占用内存还在 只是你看不见了
这样问题来了
我们由于各种原因 在开发中不得不考虑ScrollView嵌套ListView
ListView是有自己的缓存机制 占用内存总是一屏幕
但是如果将ListView嵌套到ScrollView中 问题来了
我觉得ListView的缓存机制会失效 这样需求我们是达到了
但是数据很多的情况下 内存占用太大
甚至与OOM
特此做了一个测试 发现SCrollView嵌套ListView的时候所有的Item都是新建的 ListView的缓存机制失效了
所以在UI设计稿讨论的时候 我们必须要坚持 让设计师设计出来符合规范的设计稿 一般的ListView addhead就行
GIF.gif
顺带贴上内存图 会发现ScrollView里面的ListView之后内存暴涨
GIF.gif
现在看看RecycleView 替换ListView情况 看打印的log发现情况一致 ScrollView里面的缓存机制都失效
Paste_Image.png
所以在项目制定时期 千万要设计好不要有ScrollView嵌套ListView的相关需求
如果确实需要一些UI效果
比如 下图这样 可以考虑使用新控件CoordinatorLayout
文/Daemon1993(简书作者)
原文链接:http://www.jianshu.com/p/227c69308975
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果大家要用到这种可以考虑listview加header或者recycleview加header 新控件我也想用但是公司没给学习的机会 苦逼啊 而且大家可以参考开源项目地址如下https://github.com/Mrxyx/StickyHeaderListView
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- android上改变listView的选中颜色
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- Android ListView弹性效果的实现方法
- android中ListView数据刷新时的同步方法
- Android提高之ListView实现自适应表格的方法
- Android中实现水平滑动(横向滑动)ListView示例
- Android ListView分页功能实现方法
- ScrollView滚动条颜色的设置方法
- php通过修改header强制图片下载的方法
- C#实现ListView选中项向上或向下移动的方法
- C#下listview如何插入图片
- Listview加载的性能优化是如何实现的
- C#实现listview Group收缩扩展的方法
- C# listview添加combobox到单元格的实现代码
- ListView 百分比进度条(delphi版)
- Android listview多视图嵌套多视图
- 刷新Activity中的scrollview示例(局部ui刷新)
- PHP通过header实现文本文件下载的代码