首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我想测量ListView的高度(getHight()= 0)

首先,要测量 ListView 的高度,您需要使用 Android 的测量工具,如 ViewTreeObserverOnGlobalLayoutListener。在测量过程中,您需要考虑 ListView 中包含的所有视图元素的高度。

以下是使用 ViewTreeObserver 测量 ListView 高度的示例代码:

代码语言:java
复制
ListView listView = findViewById(R.id.list_view);

ViewTreeObserver viewTreeObserver = listView.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // 获取 ListView 的高度的参考:在 onGlobalLayout() 回调中,
        // ListView 的高度为 ListView 的 ViewTreeObserver 而不是 ListView 本身
        int height = listView.getHeight();
        // 取消 ViewTreeObserver 的回调,以便在需要时进行其他测量
        viewTreeObserver.removeOnGlobalLayoutListener(this);
    }
});

如果您需要实时测量 ListView 的高度,并且 ListView 中的项是可滚动的,则可以使用 OnScrollListener,如下所示:

代码语言:java
复制
OnScrollListener scrollListener = new OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        // 当 RecyclerView 滚动状态改变时调用
        if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
            // 当 ListView 项被拖动时调用
            int firstVisible = recyclerView.findFirstVisibleItemPosition();
            int lastVisible = recyclerView.findLastVisibleItemPosition();
            int totalItemCount = recyclerView.getAdapter().getItemCount();
            int height = recyclerView.getHeight();

            // 计算 ListView 的高度
            int listViewHeight = (firstVisible == 0 ? 0 : (lastVisible == totalItemCount - 1 ? height : (firstVisible + lastVisible) * height / 2));
            // 设置 ListView 的高度
            recyclerView.setLayoutParams(new LinearLayoutManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, listViewHeight));
        }
    }

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        // 当 RecyclerView 滚动时调用
    }
};

recyclerView.addOnScrollListener(scrollListener);

在上述代码中,我们使用 findFirstVisibleItemPosition()findLastVisibleItemPosition() 方法来获取 ListView 中可见项的索引,然后使用 getHeight() 方法来获取 ListView 的高度。通过这些信息,我们可以计算出 ListView 的高度,并使用 setLayoutParams() 方法来设置 ListView 的高度。

需要注意的是,在实际应用中,您需要根据具体的需求和环境来选择合适的测量方法,并根据实际情况进行相应的调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • android scrollview嵌套listview计算高度问题

    但是为啥在scrollview中嵌套listview会出现只显示第一条listitem高度呢,原因是:scrollviewontach方法滚动事件消费处理,ListView控件高度设定问题 从谷歌那里找到...ScrollView嵌套ListView只显示一行解决办法相信很多人都遇到过,然后大部分都是用这位博主办法解决吧 刚开始也是用这个办法解决,首先感谢这位哥大私奉献,贴上地址 http:/...// 计算子项View 宽高                  listItem.measure(00);                   // 统计所有子项高度                  ...高度 但是这个代码里面有一个问题,就是这个当你ListView里面有多行TextView的话,ListView高度就会计算错误,它只算到了一行TextView高度, 这个问题在so上概述为以下...开始测量时,测量到TextView时,就调用我们onMeasure方法,我们就可以测量字体总宽度除与去掉边距屏幕大小,就可以算出文字要几行来显示,然后测量字体高度*行数可以得到字体高度,然后在加上上下边距就是

    2.3K60

    Android解决ScrollView下嵌套ListView和GridView中内容显示不全问题

    最近为公司做一个Demo里面用到了ScrollView嵌套了GridView和ListView,然而在嵌套时候发现GridView和ListView都是不能完全显示,显示基本上都是单行数据,最后查找资料和翻阅文档看到原因是...ListView和GridView绘制过程中在ScrollView中无法准确测量自身高度,而且listVIew和GridView抢占了焦点,使得ListView和GrideView具有自身显示效果...// 统计所有子项高度 int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len;..., listView); // 调用measure方法 传0测量默认大小 listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight...); } 下面是GridView方法和ListView测量方法基本一样 但是listView是单行条目的不用在担心列问题问GridView则是需要进行自己分行和自己分列 所以要注意一下

    2.4K20

    Android开发那些坑和小技巧

    但如果在列表如ListView中,用错了问题就大了。ListViewgetView方法需要计算列表条目,那就必然需要确定ListView高度,onMesure才能做测量。...如果嵌套View过于复杂,解决方案可以是通过代码测量列表所需要高度,或者在getView中使用一个小技巧:parent.getChildCount == position @Override public...需要解决ListView放到ScrollView中滑动问题和RecyclerView显示问题(如果RecyclerView高度没法计算,你是看不到内容)。...难道是在外层嵌套了这个圆形矩形?在很多地方都用了呀,为何就这个界面出现问题了? 后来才发现,这个圆形矩形包含内容太多了,已经超出了手机高度,而且可以滑好几页。...去掉radius属性确实可行,可我保留怎么办? 还有一个解决办法,通过在androidManifest.xml中禁用硬件加速,为了控制粒度,只在此activity中禁用此功能。

    1.1K30

    android ListView 嵌套 ListView

    listview还未刷新完成,导致测量高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决,试过比较多方法,添加接口让子listview 刷新完成后再去更新父listview,但还是没有作用...,也用过ExpandableListView,但是效果达不到这种,所以没办法还是得用这种办法,有大神知道怎么解决刷新父listview时子listview消失方法,指导下,比较奇怪时候刚开始初始化时候子...,猜应该是在刷新子listview时候,父listview先更新完成,子listview高度测量就没有对!...下面是源码 listview 嵌套listview都有个高度测量问题,在更新时候动态更新子listview就,下面是布局源码 <?...高度,因为这边子listviewitem高度是50dp,这里可以自己修改 listpar.height = dp2px(50*viewHolder.adapter.getCount

    1.3K20

    Android通过overScrollBy实现下拉视差特效

    ,所以需要自定义一个ListView. 2.处理头部布局文件,将其以HeaderView方式添加到自定义ListView中 3.需要获取HeaderViewImageView初始高度和ImageView...中图片高度.因为这2个高度将决定下来时候图片拉出范围,以及松手后图片回弹动画效果.对应控件宽高获取,有兴趣可以看这篇文章浅谈自定义View宽高获取 4.在overScrollBy方法内通过修改...scaleType属性,这边设置了centerCrop,以图片最小边开始截取,因为这里选择图片是高度大于宽度,所以裁剪时候会保留完整宽度,中心裁剪,如下图所示: ?...ImageView private final int startHeight;//执行动画开始时高度 private final int endHeight;//执行动画结束时高度 private...(new OvershootInterpolator()); } /** * 在指定时间内一直执行该方法,直到动画结束 * interpolatedTime:0-1 标识动画执行进度或者百分比

    1.1K51

    自定义FlowLayout,android flowLayout实现

    大家在开发过程中都碰到过这样需求,类似标签展示,要展示如上图效果,这里面的数据不确定每项字数,有的非常长,有的很短,数据动态填充。...这种情况用listView和gridView展示效果都没有上图效果。 这时我们其实是要自己写一个控件来填充上图数据,也就是我们今天要说自定义view,流式布局。...onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub // 父控件传进来宽度和高度以及对应测量模式...wrap_content情况 int width = 0; // 自己测量宽度 int height = 0; // 自己测量高度 int lineWidth = 0;// 每一行宽度...基本核心东西就上面这些 ,最上面的图是项目里面最后实现效果图。

    33020

    Android开发笔记(十二)测量尺寸与下拉刷新

    0,对应赋值方式WRAP_CONTENT; 3、MeasureSpec.EXACTLY : 表示精确,该常量十进制数值为1073741824,对应赋值方式具体dp值; 围绕着这三种模式,衍生了...其实这个下移距离就是下拉区域高度,所以只要我们在代码中算出下拉区域高度,就能够移动合适距离了。...在Android规定测量过程中,主要有三个步骤: 1、获得宽与高测量模式; 2、按照测量模式进行丈量; 3、获得测量宽与高大小; 获得宽与高测量模式 首先取到目标视图宽和高取值...接着按照原始尺寸去匹配测量模式,这里我们获取宽度模式采用了getChildMeasureSpec方法,获取高度模式采用了makeMeasureSpec方法。...; if (params.height <= 0) { heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)

    1.1K40

    抢购倒计时自定义控件实现与优化

    ,第一个参数是系统测量该View后得到规格值,这里使用0代表省略(在系统对该View绘制之前就直接调用了measure方法,所以宽高为0,该值与最终获取宽高无关),第二个参数MeasureSpec.UNSPECIFIED...view,依然可以使用这种测量方法实现自适应换行美观展示。...,数字相同位绘制新数字,数字不同位一起移动即可; 4、在移动数字时,需要将旧数字向上移动,移动距离是 0 至 负最大滚动距离;同时要将新数字向上移动,移动距离为最大滚动距离 至 0;其中最大滚动距离是数字滚动控件高度...getHight()获取是倒计时控件整个高度;textRect.height()获取是数字高度。...在实现中,倒计时控件是作为ListView子元素,而且ListView是处于一个Fragment中。

    1.5K30

    Android ListView那些事

    大家好,又见面了,是你们朋友全栈君。 ListView是我们在开发Android程序时用得比较多一种widget,通常用来展示多条数据,这里,ListView一些功能点作一个简单介绍。...看一下ListView处理touch事件方法,AbsListView#onTouchEvent()方法中,代码如下: ......Constant Value Description beforeDescendants 0 The ViewGroup will get focus before any of its descendants...有时候我们很容易让ListView高度是wrap_content,这样做,很容易导致性能问题,wrap_content意味着as big as my children,这会导致1)测量大量children...曾经遇到过一个问题,就是在维护别的写代码时,ListView上下滑动速度特别慢,把adapter等地方都优化完后,仍然一样,最终才发现ListView高度是wrap_content,把其改为match_parent

    44820

    Android--ListView复用机制源码分析

    ListView是谷歌官方一个自定义组件,用于列表展示,其中最重要是Adapter设配器,设配器模式设计为它带来了极大性能提升,一方面,内存中只有我们看ItemView被创建(对比ScrollView...//测量子控件 measureScrapChild(child, 0, widthMeasureSpec, heightSize); childWidth...,ListView只能显示一个item原因,另外如果ListView高度设置是wrap_content时,将调用measureHeightOfChildren方法,并且第三个参数是NO_POSITION...View child; // mItemCount - 1 since endPosition parameter is inclusive //在onMeasure中如果高度设置是...ListView高(wrap_content下),如果所有item高度之和小于测量建议值,则使用item高度之和,反之,用建议值。

    52010

    Android 仿京东、拼多多商品分类页

    先放一个写完之后样子: 写这个需求思路也很清晰,首先左边肯定是一个listView,右边也是一个listView,这两个listView要达到一个联动效果。...右边listView再嵌套一个GridView即可。如下图所示。...所以,我们需要数据结构也就确定了,应该是数组套数组,也就说护肤大分类下又有子分类商品,类似于这个样子: ok,数据和UI结构确定了,就可以编写代码了 1、先确定主体结构,即两个listView 先不用管上面那个...嵌套gridView会有众所周知问题,计算高度,所以这边需要重新测量高度,也就重写了gridView;第二:代码中textView是每个子标题中主标题名字,也就是需要吸在顶部。...,再将子数据都加一个type,当type不同时,更换上面那一条问题即可。

    2.7K90

    android 之 ListView 里面嵌套 GridView 遇到问题及其解决方法。

    listView点击事件阻断情况下,同时图片具有点击事件,此时再点击和图片同高度空白处,却无法执行listViewitem点击事件,点击其它非同高度地方,例如点击文字却可以。...答:     原因:     GridView 格子中View 有点击事件,证明你没阻断,之所以点击和图片同高度空白处没有执行 listView 点击事件是你GridView 霸占了整行,即使你格子只有一个...解决方法:     动态给你 GridView 设置宽度,不要使用 Wrap_Parent 等. 3,如何动态地给嵌套在Listview 里面的 GridView 设置宽、高度?...重叠、遮挡现象--如果你设置了GridView.NO_STRETCH,那么就可能会出现重叠、遮挡现象,解决方法是动态测量设备宽度再使用等比例来设置理想格子宽度,既不影响格子点击,又能相应 ListView...答:典型事件阻断,针对这种解决方法,百度上面大把解决方法。这里不罗嗦。 最终,项目的 ListView 嵌套 GridView 后效果是满足上述所有想要效果。

    1.5K50
    领券