博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android ScrollView 嵌套ListView的替代方案
阅读量:6952 次
发布时间:2019-06-27

本文共 1880 字,大约阅读时间需要 6 分钟。

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

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

要求:头部菜单固定,实现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的每一项高度,就能把以上所有的问题完美的解决。

 

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

 

转载于:https://www.cnblogs.com/tony-yang-flutter/p/3383085.html

你可能感兴趣的文章
redis 1
查看>>
如何找回电脑重新分区丢失的数据
查看>>
Python安装pycurl失败,及解决办法
查看>>
如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能
查看>>
目标检测算法的进展
查看>>
图片滑块验证码的解决
查看>>
C# 使用 GDI+ 画图
查看>>
从零開始学android&lt;ScrollView滚动视图.十八.&gt;
查看>>
fabric.js和高级画板
查看>>
oracle安装后tnsnames.ora内容
查看>>
微信小程序开发--第一个项目
查看>>
BZOJ1060: [ZJOI2007]时态同步(树形dp 贪心)
查看>>
Dcloud课程8 开心一刻应用如何实现
查看>>
Unable to locate Spring NamespaceHandler for XML schema namespace
查看>>
WPF中获取鼠标相对于桌面位置
查看>>
APICloud和海马玩模拟器结合调试手机页面
查看>>
eclipse打断点,进行弹窗提示后点击是才进入debug视图,这个要怎么恢复
查看>>
CentOS7 安装 mysql8
查看>>
[TypeScript] Define Custom Type Guard Functions in TypeScript
查看>>
人人都要培养AIQ
查看>>