滚动时 ListView 布局问题

ListView Layout Issues While Scrolling

在我的 Nativescript 应用程序中,我构建了一个 ListView,其中每个列表项都包含一个带有嵌套 GridLayout 的堆栈布局。这是 XML.

的示例
    <ListView  row="2" items="{{ measurements }}" id="measurement-list" loaded="" itemTap="">
        <ListView.itemTemplate>
            <StackLayout>
                <Label class="date-seperator" text="{{header | dateShortDate}}" textWrap="true" visibility="{{ header ? 'visible' : 'collapsed' }}"/>
                <GridLayout columns="8,*,10,*" rows="*, *" class="{{'measurement-item trend-' + MeasurementColor}}">
                    <Label class="{{'severity-' + MeasurementColor}}" col="0" rowSpan="2"  text="" />  
                    <WrapLayout col="1" orientation="horizontal" itemWidth="" itemHeight="">
                        <Label class="measurement-value" col="1" text="{{Value}}" />
                        <Label id="trend-arrow" class="{{'sm-arrow-' + TrendArrow }}" col="1" />                                
                    </WrapLayout>                                                                                               
                    <Label class="measurement-uom"   col="1" row="1" text="mg/dl"/>
                    <Label class="measurement-time"  col="3" row="0" text="{{Timestamp | dateTimeStamp}}"/>                
                </GridLayout>                    
            </StackLayout>                 
        </ListView.itemTemplate> 
    </ListView> 

我遇到了一个问题,当我滚动列表视图时,列表项的布局开始扭曲,元素错位或完全消失。具有布局问题的列表项也不一致。如果我向上滚动并看到一些损坏的项目,我可以在几秒钟后向后滚动,它们会很好,但列表中的其他项目看起来会变形。知道什么会导致这个或者我可以用什么来解决它吗?下面是我的意思的屏幕截图。

编辑 我根据接受的答案建议重组了列表视图中的 xml,现在问题已解决。以下是更新后的 xml,以防有人遇到类似问题。

<ListView  row="2" items="{{ measurements }}" id="measurement-list" loaded="" itemTap="">
    <ListView.itemTemplate>
        <StackLayout>
            <Label class="date-seperator" text="{{header | dateShortDate}}" textWrap="true" visibility="{{ header ? 'visible' : 'collapsed' }}"/>
            <GridLayout columns="8,80,*,90" rows="*, *" class="{{'measurement-item trend-' + MeasurementColor}}">
                <Label rowSpan="2" col="0" class="{{'severity-' + MeasurementColor}}" text="" />                        
                    <Label row="0" col="1" horizontalAlignment="right" class="measurement-value" text="{{Value}}" />
                    <Label row="0" col="2" horizontalAlignment="left" class="{{'trend-arrow sm-arrow-' + TrendArrow }}" />                                                                                                          -->
                <Label row="1" col="1" horizontalAlignment="right" class="measurement-uom" text="{{ UOM | getUOMFromGlucoseType }}"/>
                <Label row="0" rowSpan="2" col="3" horizontalAlignment="left" verticalAlignment="middle" class="measurement-time" text="{{Timestamp | dateTimeStamp}}"/>                        
            </GridLayout>
        </StackLayout>
    </ListView.itemTemplate>
</ListView>

2 个问题。一是对于 GridLayout,您需要考虑 table 中的每个单元格 - 您没有。例如第 1 列第 3 行

但它出现这种行为的主要原因是 ListView 的工作方式。 ListView 似乎在创建期间测量一次布局,然后在您滚动时,对象被丢弃并再次用于不同的底层对象。所以,例如如果标签包含 4:29 一次 - 标签宽度设置为适合该标签。下次 ListView 在同一项目中放置更长的文本标签时 - 11:34 - space 不够用,listview 决定不显示它。解决方案?明确设置列的宽度。