Xamarin Forms-重绘视图

时间:2018-08-28 09:48:27

标签: c# xamarin xamarin.forms redraw

我正在使用Xamarin Forms XAML编写应用程序,并且需要一种重绘视图的方法。

我有一个包含多个Label和一个ListView的布局。我还有一个按钮,当按下该按钮时,会调用API来下载一组新的数据,这些数据需要更新页面上的控件。

我所有的控件都正确绑定,因此当数据在后台更新时,数据确实会在视图上更新,但是控件不会重绘,因此会弄乱布局的外观。

有时候,我的ListView中的数据只能是1或2行,但通常会更多。第一次绘制页面时,一切看起来都很好,但是我的问题是,使用控件中不调整大小的ListView中具有不同行数的数据更新视图时。

示例:

第一次进入屏幕时,我下载了数据,并且ListView有10个项目,因此在屏幕上绘制了10行

当我按下“重新加载数据”按钮时,下载的数据现在可能仅包含2个项目。数据已正确更新,但屏幕上的间距仍与第一次绘制时(带有10个项目)的大小相同,所以我现在有很大的空白。

如果完成了本示例的相反操作(第一个条目为2个项目,第二个条目为10个项目),则ListView的空间仍然只有2个项目高,因此您只能看到10个项目中的2个。 / p>

我想要做的是,在下载新数据时以某种方式刷新控件,以便重新绘制ListView的大小,并且始终是所显示项目数量的正确大小。

1 个答案:

答案 0 :(得分:0)

有同样的问题。我认为您的做法不对。 ListView不能像您认为的那样工作。它并非旨在始终完全适合其内容。如果需要,您需要自己计算高度并将其设置为ListView

一种方法是更改​​ListView的高度。您可以通过将属性绑定到HeightRequest来实现:

<ListView
  HeightRequest="{Binding ListViewHeight}">
</ListView>

这是我对ListViewHeight的计算。 RowHeight对于Android是72,对于iOS是75。由于高度的硬编码值,这是一个肮脏的解决方案,但这是我找到的最佳解决方案。请记住,您需要调整这些值以适合您的需求,否则ListView可能太小/太高。

public double ListViewHeight
{
    get
    {
        if (MyItemsList!= null)
        {
            double listViewHeight = MyItemsList.Count * RowHeight;
            if (CanLoadMoreNotifications)
            {
                listViewHeight += RowHeight;
            }
            return listViewHeight;
        }
        return 0;
    }
}

现在,每次对列表进行更改时,请致电RaisePropertyChanged("ListViewHeight");。这样,您的ListView身高就会被计算出来,并且您的用户界面也会更新。