有关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的那些事相关推荐

  1. 四种方案解决ScrollView嵌套ListView问题

    在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结 ...

  2. android中ScrollView嵌套ListView或GridView显示位置问题

    Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...

  3. ScrollView嵌套ListView后,进入页面不从顶部开始显示的问题解决

    ScrollView嵌套ListView后,进入页面不从顶部开始显示的问题解决 首先,正常情况下,如果在ScrollView里嵌套ListView后,会发现ListView只显示1条数据 那么,为了解 ...

  4. scrollview嵌套listview 滑动事件冲突的解决方法

    scrollview嵌套listview 滑动事件冲突的解决方法 参考文章: (1)scrollview嵌套listview 滑动事件冲突的解决方法 (2)https://www.cnblogs.co ...

  5. android解决ScrollView嵌套ListView不能下拉刷新

    为了不误导新人,这篇帖子写的比较早了,这里2016年2月23日21:33:20更新的内容: 千万不要在实际开发中用scrollview嵌套listview\recylerview来处理滑动嵌套,   ...

  6. ApkBus---四种方案解决ScrollView嵌套ListView问题

    原文链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=161576 一. 为什么要使用ScrollView嵌套ListView的奇怪的 ...

  7. ScrollView嵌套ListView处理事件冲突

    当ListView嵌套在ScrollView中时会有两个问题 列表内容显示不全 滑动事件冲突 第一个问题可以参考ScrollView与ListView嵌套仿微博个人主页中的解决方法. 第二个问题就是下 ...

  8. ScrollView嵌套ListView只显示一行

    在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容.在最近的工作中,遇见一个需求,需要将ListView嵌套到ScrollView中显示.于是乎有了如下布局: & ...

  9. 日积月累:ScrollView嵌套ListView只显示一行

    在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容.在最近的工作中,遇见一个需求,需要将ListView嵌套到ScrollView中显示.于是乎有了如下布局: [ ...

最新文章

  1. 1.8 centos7 的PATH、cp/mv/文档查看命令介绍
  2. 用Matplotlib轻松复刻分析图,看看哪个城市买房最自由
  3. DevOps的几个场景
  4. Pyinstall打包多个python脚本,包含DLL文件
  5. java面试题42从以下哪一个选项中可以获得Servlet的初始化参数?
  6. flex item的width VS flex-basis
  7. Python 操作 MongoDB
  8. Gtk-WARNING : cannot open display----这个问题在NVIDIA TX2上碰到过就是DISPLAY=“:0“
  9. Vue系列之搭建环境
  10. CAM350测量pcb尺寸的操作方法
  11. contextcapture多区块点云_Smart 3D (ContextCapture) 4.4.6版本最新功能
  12. 排序算法之---希尔排序(一看你就懂滴)
  13. 5g8大学计算机基础东南大学,东南大学新学期迎来5G新网红 省内首家高校5G概念示范厅来了...
  14. sharepoint 2013 文档库eventhandle权限控制
  15. 出自上帝之手的精妙算法 - Algorithm from THE BOOK (1)
  16. 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元
  17. subsonic配置
  18. Python常用模块——随机函数(random)
  19. FileZilla网络配置
  20. 一位男人写【最疼我的妻子走了】好感动

热门文章

  1. Android 9.0以上联网报错:CLEARTEXT communication to xxx.xxx.xxx.xx not permitted by network security policy
  2. UVA 10118-Free Candies
  3. 神秘代码(链接至steam指南)
  4. 笔记本当服务器显示屏,笔记本当服务器屏幕设置
  5. python安装不了是什么问题_python为什么安装了运行不了?
  6. 惠普测试c语言,HP的分院测试转自HP超话
  7. MyBatis-plus 查询 模糊查询的使用
  8. 多肉商店html网页代码,[转载]国外多肉植物及种子购买网站(转载)
  9. Office365软件安装包+安装教程
  10. 20 个顶尖的 Python 机器学习开源项目