我正在使用Xamarin Forms XAML编写应用程序,并且需要一种重绘视图的方法。
我有一个包含多个Label和一个ListView的布局。我还有一个按钮,当按下该按钮时,会调用API来下载一组新的数据,这些数据需要更新页面上的控件。
我所有的控件都正确绑定,因此当数据在后台更新时,数据确实会在视图上更新,但是控件不会重绘,因此会弄乱布局的外观。
有时候,我的ListView中的数据只能是1或2行,但通常会更多。第一次绘制页面时,一切看起来都很好,但是我的问题是,使用控件中不调整大小的ListView中具有不同行数的数据更新视图时。
示例:
第一次进入屏幕时,我下载了数据,并且ListView有10个项目,因此在屏幕上绘制了10行
当我按下“重新加载数据”按钮时,下载的数据现在可能仅包含2个项目。数据已正确更新,但屏幕上的间距仍与第一次绘制时(带有10个项目)的大小相同,所以我现在有很大的空白。
如果完成了本示例的相反操作(第一个条目为2个项目,第二个条目为10个项目),则ListView的空间仍然只有2个项目高,因此您只能看到10个项目中的2个。 / p>
我想要做的是,在下载新数据时以某种方式刷新控件,以便重新绘制ListView的大小,并且始终是所显示项目数量的正确大小。
答案 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
身高就会被计算出来,并且您的用户界面也会更新。