有关Scrollview嵌套ListView的那些事
有关Scrollview嵌套ListView的那些事
同样作为滑动控件的scrollview与listview,似乎本不应该嵌套使用,可作为研发的我们通常无法左右UI妹子们的奇(fan)思(ren)妙(lei)想。作为一个负责任的研发,必须时刻做好兵来将挡的准备。
首先我们来看这样一张设计稿:
整个页面整体是一个带下拉刷新的布局,这里用到了被大家最广泛使用的PullToRefreshLayout,同时由于UI设计风格的不断演变,这个页面的内容也不断增多,于是乎在PullToRefreshLayout内部又放了一个Scrollview来滑动显示更多内容,在最近的一期任务中,新增了车辆操作记录这一项,即图片最下方的那个listview,于是乎这一个小小的页面竟然嵌套了PullToRefreshLayout ,Scrollview 与ListView三个滑动控件。
起初接到设计的时候并没有觉得什么,无非就是再加一个ListView么,简单的很,直接开码,item布局,adapter,分分钟搞定,当服务端接口开发完成,准备联调的时候,瞬间傻眼。无论接到的返回体数组的size为几,listview的显示永远只是可怜的一条。经过一番调查终于发现当listview嵌套在Scrollview中时无法正确计算自己的高度,无法正确计算listview实际的高度,但确刚刚好显示了一条数据,那是不是意味着可以通过listview的adapter获取item的个数,然后根据总item个数与单个item的高度计算出listview的实际高度呢?
手动计算listview高度
public void setListViewHeightBasedOnItem(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);if (null != listItem) {listItem.measure(0, 0);totalHeight += listItem.getMeasuredHeight();}}ViewGroup.LayoutParams params = listView.getLayoutParams();params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));listView.setLayoutParams(params);}
退出程序,Shift+F10,回车
再次观察运行结果,Perfect,listview的高度被完美的计算出来了。然而帅不过三秒,又出现了新的问题,那就是由于页面内容过多超出了一屏,导致每次进入这个页面,scrollview都自动滚动到了底部,这是什么鬼,好在还没有交付测试组,赶紧整改。
起初走了一些弯路,以为是scrollview的问题,于是写了一个手动让scrollview滑动到顶部的方法。
当开始layout的时候让scrollview滑动到顶部
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {scrollView.post(new Runnable() {public void run() {scrollView.fullScroll(ScrollView.FOCUS_UP);Glide.with(context).load(viewData.pictureUrl).error(context.getResources().getDrawable(R.drawable.bg_nopicture_loading)).diskCacheStrategy(DiskCacheStrategy.SOURCE).placeholder(context.getResources().getDrawable(R.drawable.bg_nopicture_loading)).fitCenter().dontAnimate().into(viewAdapter.carPicture);viewAdapter.parent.setVisibility(View.VISIBLE);}});}});
但这不是正路,顶多算是野路子,作为一个追求真理的好少年,这种方法当然不可行。最后在不懈努力之下,找到了原因,还是源于嵌套滑动。因为listview是一个滑动控件,具有滑动属性,所以,在手动计算listview高度的时候listview获取焦点,在listview滑动的驱动下,页面滑动到了listview的底部。解决方案是将listview不获取焦点。
让listview不获取焦点
viewController.getActionListView().setFocusableInTouchMode(false);viewController.getActionListView().setFocusable(false);
我们还有第二种方法:
让顶部view获取焦点
public static void scrollToTop(View view){view.setFocusable(true);view.setFocusableInTouchMode(true);view.requestFocus();}
让页面最上边的view获取焦点
有关Scrollview嵌套ListView的那些事相关推荐
- 四种方案解决ScrollView嵌套ListView问题
在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结 ...
- android中ScrollView嵌套ListView或GridView显示位置问题
Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...
- ScrollView嵌套ListView后,进入页面不从顶部开始显示的问题解决
ScrollView嵌套ListView后,进入页面不从顶部开始显示的问题解决 首先,正常情况下,如果在ScrollView里嵌套ListView后,会发现ListView只显示1条数据 那么,为了解 ...
- scrollview嵌套listview 滑动事件冲突的解决方法
scrollview嵌套listview 滑动事件冲突的解决方法 参考文章: (1)scrollview嵌套listview 滑动事件冲突的解决方法 (2)https://www.cnblogs.co ...
- android解决ScrollView嵌套ListView不能下拉刷新
为了不误导新人,这篇帖子写的比较早了,这里2016年2月23日21:33:20更新的内容: 千万不要在实际开发中用scrollview嵌套listview\recylerview来处理滑动嵌套, ...
- ApkBus---四种方案解决ScrollView嵌套ListView问题
原文链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=161576 一. 为什么要使用ScrollView嵌套ListView的奇怪的 ...
- ScrollView嵌套ListView处理事件冲突
当ListView嵌套在ScrollView中时会有两个问题 列表内容显示不全 滑动事件冲突 第一个问题可以参考ScrollView与ListView嵌套仿微博个人主页中的解决方法. 第二个问题就是下 ...
- ScrollView嵌套ListView只显示一行
在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容.在最近的工作中,遇见一个需求,需要将ListView嵌套到ScrollView中显示.于是乎有了如下布局: & ...
- 日积月累:ScrollView嵌套ListView只显示一行
在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容.在最近的工作中,遇见一个需求,需要将ListView嵌套到ScrollView中显示.于是乎有了如下布局: [ ...
最新文章
- 1.8 centos7 的PATH、cp/mv/文档查看命令介绍
- 用Matplotlib轻松复刻分析图,看看哪个城市买房最自由
- DevOps的几个场景
- Pyinstall打包多个python脚本,包含DLL文件
- java面试题42从以下哪一个选项中可以获得Servlet的初始化参数?
- flex item的width VS flex-basis
- Python 操作 MongoDB
- Gtk-WARNING : cannot open display----这个问题在NVIDIA TX2上碰到过就是DISPLAY=“:0“
- Vue系列之搭建环境
- CAM350测量pcb尺寸的操作方法
- contextcapture多区块点云_Smart 3D (ContextCapture) 4.4.6版本最新功能
- 排序算法之---希尔排序(一看你就懂滴)
- 5g8大学计算机基础东南大学,东南大学新学期迎来5G新网红 省内首家高校5G概念示范厅来了...
- sharepoint 2013 文档库eventhandle权限控制
- 出自上帝之手的精妙算法 - Algorithm from THE BOOK (1)
- 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元
- subsonic配置
- Python常用模块——随机函数(random)
- FileZilla网络配置
- 一位男人写【最疼我的妻子走了】好感动
热门文章
- Android 9.0以上联网报错:CLEARTEXT communication to xxx.xxx.xxx.xx not permitted by network security policy
- UVA 10118-Free Candies
- 神秘代码(链接至steam指南)
- 笔记本当服务器显示屏,笔记本当服务器屏幕设置
- python安装不了是什么问题_python为什么安装了运行不了?
- 惠普测试c语言,HP的分院测试转自HP超话
- MyBatis-plus 查询 模糊查询的使用
- 多肉商店html网页代码,[转载]国外多肉植物及种子购买网站(转载)
- Office365软件安装包+安装教程
- 20 个顶尖的 Python 机器学习开源项目