How to configure ListView to automatically change its height?

前端 未结 5 1654
梦毁少年i
梦毁少年i 2021-01-03 04:50

I have three ListView widgets in the same LinearLayout. Something like this (I\'m omitting XML elements that are not relevant in this example):

5条回答
  •  清歌不尽
    2021-01-03 05:43

    I've implemented it this way (code is work in progress so it's more a idea source than solution):

    package com.customcontrols;
    public class NoScrollListView extends ListView
    {
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0) );
    
            // here I assume that height's being calculated for one-child only, seen it in ListView's source which is actually a bad idea
            int childHeight = getMeasuredHeight() - (getListPaddingTop() + getListPaddingBottom() +  getVerticalFadingEdgeLength() * 2);
    
            int fullHeight = getListPaddingTop() + getListPaddingBottom() + childHeight*(getCount());
    
            setMeasuredDimension(getMeasuredWidth(), fullHeight);
        }
    }
    

    the calculation's not perfect, but it's close and works so far. after that you just create a layout like this:

    ScrollView com.customcontrol.NoScrollListView com.customcontrol.NoScrollListView com.customcontrol.NoScrollListView /ScrollView

    The scrollView's crucial since you can easily run out of screen bounds.

    PS. The calculation's rectum-driven since most of the calculation methods in ListView&Co are package private which is quite a strange choice for publicly inheritable classes for UI.

提交回复
热议问题