Android 中ScrollView嵌套GridView,ListView的实例
作者:gengqiquan 发布时间:2023-06-15 15:49:56
Android 中ScrollView嵌套GridView,ListView的实例
在Android开发中,经常有一些UI需要进行固定style的动态布局,然而由于现在的UI都喜欢把一个界面拉的很长,所以我们很多情况下需要使用ScrollView来嵌套列表控件来实现UI。这样就导致了很多不顺心的问题。
问题一:列表控件显示不完全
原因是嵌套情况下,ScrollView不能正确的计算列表控件的高度。
有两种解决方案
方案一
在适配器赋值完成后代码动态计算列表的高度。这里贴出ListView的计算代码,GridView的计算方式类似,不过需要考虑列数,下面代码没有加上列表控件padding的计算,如果你设置了这个属性,需要加上计算代码
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
方案二
重写列表控件的onMeasure方法,这种方案不会出现列表控件本身的滚动条,并且viewholder复用机制会失效
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(1 << 16, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
方案一代码多,需要多次写,建议写成工具类方便调用;方案二在数据量大到不能一屏显示完的情况下会有性能问题,而且快速滑动的时候ScrollView会不停的去计算列表控件的高度。贼影响绘制性能。
两种方案有利有弊,大家自己取舍
问题二:列表控件自动获取焦点,导致ScrollView自动滚动到列表控件所在的位置
这个问题其实有很多种解决方案,归结起来是两种。
方案一
等待列表控件数据全部加载完成后(包括图片加载)调用ScrollView.fullScroll(ScrollView.FOCUS_UP);
方法让ScrollView滚动到顶部。这个加载完成的时间不好控制,搞得不好会有滚动动画出现,很尴尬的事情。
方案二
重写列表控件的如下两个方法,使之固定返回false
@Override
public boolean isFocused() {
return false;
}
@Override
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
return false;
}
两种方案的优缺点很明显,喔,第二种方案的缺点我目前没发现。如果你这么使用发现了什么坑,请留言告知
问题三 滑动冲突
这问题就更 * 了,根据UI的不同, * 程度也不同,涉及到view的事件传递知识,很难给出所有情况的解决代码
解决起来也离不开几个要点,不过首先你得熟悉view的事件传递
你需要根据情况决定重写列表控件与ScrollView的如下几个方法,根据情况给方法返回不同的bool值来告诉控件是否拦截或者传递事件,需要哪个控件相应哪个方向的滚动事件就拦截哪个方向的事件传递,作为一个有追求的开发者,切记不要一通乱拦截
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
给个小彩蛋
getParent().requestDisallowInterceptTouchEvent(boolean b);
这一句代码可以在子控件里决定是否让父容器获取事件
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 前言我们在使用spring security的时候可以通过好几种方法获取用户信息, 但是今天这篇文章介绍的是一个笔者觉得最优雅的实现; 借鉴
- 首先我们建立两个数据库(可以不在同一台电脑上):multiple_order:DROP DATABASE IF EXISTS `multip
- 时钟的使用1、声明VOID CALLBACK playproc( HWND hwnd, &nb
- 在市面上很多的APP都使用了对图片作模糊化处理后作为背景的效果,来使得整个页面更具有整体感。如下就是网易云音乐的音乐播放页面:很明显这个页面
- 本文实例讲述了java实现统计字符串中字符及子字符串个数的方法。分享给大家供大家参考,具体如下:这里用java实现统计字符串中的字符(包括数
- 本文实例为大家分享了Android实现支付宝记账饼图,点击旋转到最下面,供大家参考,具体内容如下代码:package com.example
- 1、Redis 怎么保证高可用、有哪些集群模式主从复制、哨兵模式、集群模式。2、主从复制在当前最新的 Redis 6.0 中,主从复制的完整
- 本文实例讲述了Android判断Activity是否在最上层的方法。分享给大家供大家参考,具体如下:private boolean isTo
- 第一步:图形验证码接口1.使用第三方的验证码生成工具Kaptchahttps://github.com/penggle/kaptcha@Co
- 本文实例为大家分享了Android颜色渐变动画效果的实现代码,供大家参考,具体内容如下前言案例效果的实现比较简单,利用Android自带的颜
- 本文实例为大家分享了java实现数字转换人民币中文大写的具体代码,供大家参考,具体内容如下业务场景:1.在人事业务系统开发的报表打印文书时经
- 高分配速率(High Allocation Rate)分配速率(Allocation rate)表示单位时间内分配的内存量。通常使用&nbs
- 关于logback日志的详解见这位仁兄的博客:Spring Boot-日志配置(超详细)我在这就开门见山直接介绍我们项目日志的配置使用吧!~
- 最近因项目需要,需要跨域请求访问数据。跨域访问是指什么?[跨域]:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器
- 一、题目描述二、思路语法基础:StringBuilder 类似列表,可以更改元素。package Practice;public class
- 本文实例讲述了Android编程实现向桌面添加快捷方式的方法。分享给大家供大家参考,具体如下:有时候为了使用方便,需要在桌面上添加快捷方式,
- 前言Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁。本文不讨论 synchronized 的具体使
- 话不多说,直接上实例:一、获取集合内重复值public void GetDuplicateValue(){ List<st
- 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通
- 本文实例讲述了Android开发实现的标准体重计算器功能。分享给大家供大家参考,具体如下:运行结果界面: 界面设计<Rela