概要:本例仅提供替代思路。

原需求:实现下图这个布局

要求:头部菜单固定,实现Viewpager、中间的按钮菜单,底部的listview一起能够上下滚动。

做法:

把Viewpager、中间的按钮菜单,底部的listview使用一个ScrollView套起来,这样就能够实现上下滑动。

这样做的问题:运行程序后你会发现listview始终显示的是第一个Item而其他的item不见了,其实不是其他的item不见了,而是其他的item被第一个item遮挡了,此时你可以滑动第一个item来看其他的item,但是当你滑动时问题又来了,你会发现你的item滑动的非常的不顺畅,或者根本就没办法滑动,因为在你滑动时scrollview会跟着滑动,这是为什么呢?其实是你的ScrollView的滑动时间和Listview的滑动事件起冲突了,最后你会发现这样做不行啊,这根本不是我想要的效果啊,怎么办呢?

改进做法:

这样哈,上面不是说ScrollView和ListView的滑动事件不是起冲突了吗?那好,现在我们把ListView的滑动事件禁用掉,那么怎样禁用呢?我们可以这样,把ListView的每一项循环计算高度,这样ListView就不会有滑动效果了。

代码如下:使用下面的代码要注意了,ListView的Item最好是LinearLayout,当然也可以使用RelativeLayout但是要重新定义一下RelativeLayout这里就不再细说了,大家可以到网上查查,都能找到答案的。

public 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));
((MarginLayoutParams) params).setMargins(10, 10, 10, 10);
listView.setLayoutParams(params);
}

好了,到此为止问题解决了。但是真的解决了吗?是一定符合我们的需求吗?

现在又有心需求了,要求,在ListView中的Item项中,事先隐藏item的介绍,当点击时显示,再次点击时显示。看到这个地方时有些朋友开始吐槽了,这有什么难的?不久是在item中事先隐藏一个控件点击时显示不就行了吗?嗯,这个朋友说的不错,但是给予以上代码 ,真的能够轻松的实现这种效果吗?答案是否定的,当你按照你的思路改进并运行程序后你会发现,无论怎样点击item,隐藏的东西就是显示不出来。这是为什么呢?那是因为你的item由于是计算过高度的所以你在点击你的item时并没有多于的空间来显示你的隐藏内容。怎样解决呢?这就要用到咱们今天说的重点了,使用一种方法代替ScrollView嵌套ListView!

改进二:

是这样的在无意中看到stackoverflow上的一个哥们是这样解决的,可以把:

这一部分当作ListView的头部(header),即向lsitview中添加addheader()方法,这样就不会出现双滑动,也不用计算listview的item的每一项高度,就能把以上所有的问题完美的解决。

好了,文章到此结束,次篇文章主要是告诉那些有时思路会陷入死胡同中的朋友,其实有些时候换一个思路问题就会变得非常简单。不是吗?呵呵。。

Android ScrollView 嵌套ListView的替代方案的更多相关文章

  1. android scrollview嵌套listview计算高度的问题

    ScrollView中只能放一个控件,一般都放LinearLayout,orientation属性值为vertical.在LinearLayout中放需要呈现的内容.ListView也在其中,List ...

  2. android:ScrollView嵌套ListView的问题

    在ScrollView中嵌套使用ListView,看起来ListView只会显示一行多一点,不能滑动.ListView的高度怎么改都有问题,与预期不符合.搜索了一些解决方案,我觉得最好不要用这样的设计 ...

  3. Android ScrollView 嵌套 ListView、 ListView 嵌套ScrollView Scroll事件冲突解决办法

    本人菜鸟一名,最近工作了,开始学习Android. 最近在做项目的时候,UX给了个design,大概就是下拉刷新的ListView中嵌套了ScrollView,而且还要在ScrollView中添加动画 ...

  4. Android scrollview嵌套listview运行后最先显示出来的位置不在顶部而是中间问题

    scrollview里面嵌套了一个listview ,通过设置一个方法设置了listview的高度 现在的情况就是进到这个界面的时候看到的不是最上面 而是中间 ,该问题的解决办法为: mScrollV ...

  5. android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件

    在开发中遇到ScrollView嵌套ListView的问题,最开始发出不能全屏,效果是这样的: 但我想要的效果是这样的: 下面看一下布局文件: <?xml version="1.0&q ...

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

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

  7. 【Android - 问题解决】之ScrollView嵌套ListView时总是自动滑动到ListView顶部的问题

    最近做了一个项目,里面有一个ScrollView嵌套ListView的布局. 做出来之后发现,进入这个界面之后,总是自动滑动到ListView的顶部,而ScrollView中位于ListView上面的 ...

  8. Android——MeasureSpec学习 - 解决ScrollView嵌套ListView和GridView冲突的方法

      原文地址:http://blog.csdn.net/yuhailong626/article/details/20639217   在自定义View和ViewGroup的时候,我们经常会遇到int ...

  9. 关于ScrollView嵌套ListView问题

    Android开发之ScrollView中嵌套ListView的解决方案   原文:http://blog.csdn.net/minimicall/article/details/40983331   ...

随机推荐

  1. CF712E Memory and Casinos

    设\(f[i]\)为从\(i\)到\(r+1\)且不走出区间的概率 \(f[i]=p[i]f[i+1]+(1-p[i])f[i-1]\) \(f[i]-f[i-1]=p[i](f[i+1]-f[i-1 ...

  2. JavaSE——TCP协议网络编程(二)

    1.Java网络编程与多线程的综合应用: 类Socket提供了方法getInputStream ()和getOutStream()来得到对应的输入/输出流以进行读/写操作,这两个方法分别返回Input ...

  3. Kendo Grid控件中将枚举值转为枚举名显示

    我们在开发过程中经常会遇到需要将枚举值转换成名称进行显示的情况.如下我们有这样一个数据源对象: var users = [ {id: 1, name: "similar1", st ...

  4. Dynamics CRM2016 如何删除Word/Excel Templates

    创建模板的方式有两种,一种是创建个人级别的模板,如下面这种创建一个excel的模板 一种是在设置-模板中创建,但这需要管理员权限,从下图中可以看出个人级的模板在设置中是看不到的 那就涉及到一个问题了, ...

  5. Mockjs 前端接口数据模拟

    在前后端分离的项目中,通常需要启动一个后台服务器来配合前端项目的接口需求.Mockjs的作用是拦截ajax请求并模拟各种数据返回,让前端开发可以更加自由独立. 安装 npm install mockj ...

  6. Vue入门系列(三)之Vue列表渲染及条件渲染实战

    Vue官网: https://cn.vuejs.org/v2/guide/forms.html#基础用法 [入门系列] (一)  http://www.cnblogs.com/gdsblog/p/78 ...

  7. Httprunner学习

    一.简介 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. 核心特性: 继 ...

  8. mysqldump: Error 2013

    最近在mysqldump时,遭遇mysqldump: Error 2013错误.以为是常见的参数设置有问题,调整之后,也没有任何成效.原来发生了OOM,以下是其具体描述. 一.故障现象 环境 # mo ...

  9. DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)

    简介 动态链接库最大的优势在于可以提供给其他应用程序共享的资源,最小化应用程序代码的复杂度,其中一个十分重要的功能就是dll可以导出封装函数的功能.导出函数有两种主要方式,分别是静态导入和动态导入,本 ...

  10. 解决:Windows 强制升级为8.1之后 Mysql连接不上, VisualSVN Server无服务

    1.mysql 连不上,只要将mysql重新加为windows服务即可.(我的是mysql-5.6.24-winx64 解压版)    方法:mysqld --install mysql --defa ...