当前位置: 首页 > news >正文

Android 解决ScrollView嵌入ListView | GridView | ScrollView显示问题

一、ScrollView中嵌套ListView

ScrollView和ListView都是滚动结构,很明显如果在ScrollView中加入ListView,可以预见性的知道,肯定会有显示/滚动的问题,接下来就分享我在网上找到的方法(有2种方法);

M1、手动设置(计算)ListView的高度

/**
 * 动态设置ListView的高度
 * @param listView
 */
public static void setListViewHeightBasedOnChildren(ListView listView) { 
    if(listView == null) return;

    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)); 
    listView.setLayoutParams(params); 
}

上面这个方法很显然,就是设定ListView的高度了,在为ListView设置了Adapter之后使用,就可以解决问题了。
但是使用这个方法有个细节需要注意:Adapter中getView方法返回的View的必须由LinearLayout组成,因为只有LinearLayout才有measure()方法,如果使用其他的布局如RelativeLayout,在调用listItem.measure(0, 0);时就会抛异常,因为除LinearLayout外的其他布局的这个方法就是直接抛异常的。

M2、自定义ListView,适应嵌入ScrollView中

public class ListViewForScrollView extends ListView {
    public ListViewForScrollView(Context context) {
        super(context);
    }

    public ListViewForScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ListViewForScrollView(Context context, AttributeSet attrs,
        int defStyle) {
        super(context, attrs, defStyle);
    }
        
    @Override
    /**
     * 重写该方法,达到使ListView适应ScrollView的效果
     */
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

其实,这个方法也就是重写onMeasure方法,重新计算ListView的高度,不过比第一个方法更加简单简洁;
同样,使用这个方法时,需要注意一点,默认scrollview会滚动到ListView的第一项,此时只需要让scrollview滚动到最顶端即可:

scrollview.smoothScrollTo(0, 0);

 

二、ScrollView中嵌套GridView
参考ScrollView中嵌套ListView的第二个实现方法,不过有一占小的区别;参见如下代码:

public class GridViewForScrollView extends GridView {   
private boolean haveScrollbar = true;
public GridViewForScrollView(Context context) { super(context); } public GridViewForScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public GridViewForScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 设置是否有ScrollBar,当要在ScollView中显示时,应当设置为false。 默认为 true * * @param haveScrollbars */ public void setHaveScrollbar(boolean haveScrollbar) { this.haveScrollbar = haveScrollbar; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (haveScrollbars == false) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } }

 

三、ScrollView嵌套ScrollView

        parent.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                parent.requestDisallowInterceptTouchEvent(false);
                return false;
            }
        });
        child.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // 禁止parent view响应child view的触摸事件
                child.requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });

这个方法的核心在于:当触摸事件发生在child身上时,禁止parent view响应child view的触摸事件;

转载于:https://www.cnblogs.com/a284628487/p/3696403.html

相关文章:

  • 万能写入sql语句,并且防注入
  • 进程通信
  • Delphi控制Excel
  • Tigase XMPP Server源码部署
  • 在iphone越狱机器中使用Hook
  • 报错:具有键...的ViewData项属于类型...,但它必须属于类型IEnumerableSelectListItem...
  • DELPHI7在WIN8和WIN10下安装和运行
  • mysql 如何选择随机行
  • 字符串通信协议解析函数
  • 虚拟机下host-only模式服务器之间通信
  • DATASNAP远程方法返回TSTREAM正解
  • 对比学习UIKit和AppKit--入门级
  • SVM算法入门
  • 分布函数(连续型连续型)
  • iOS应用开发攻略(助你iOS开发中攻城拔寨)
  • Android优雅地处理按钮重复点击
  • Laravel 实践之路: 数据库迁移与数据填充
  • SpringCloud集成分布式事务LCN (一)
  • tab.js分享及浏览器兼容性问题汇总
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue.js框架原理浅析
  • vue2.0项目引入element-ui
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 给新手的新浪微博 SDK 集成教程【一】
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何编写一个可升级的智能合约
  • 深度学习入门:10门免费线上课程推荐
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 容器镜像
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (1)(1.13) SiK无线电高级配置(六)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (五)MySQL的备份及恢复
  • (五)Python 垃圾回收机制
  • ***检测工具之RKHunter AIDE
  • .describe() python_Python-Win32com-Excel
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .Net6 Api Swagger配置
  • .net分布式压力测试工具(Beetle.DT)
  • /boot 内存空间不够
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @Autowired多个相同类型bean装配问题
  • @javax.ws.rs Webservice注解
  • @WebServiceClient注解,wsdlLocation 可配置
  • @软考考生,这份软考高分攻略你须知道
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [codeforces]Checkpoints
  • [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape
  • [Django 0-1] Core.Email 模块