在发现没有明确的方法来调整ListView以适应内容之后,我决定扩展ListView以在每次添加子项时调整自身大小。我试过这段代码,但它没有用。可能是什么问题呢?我该如何解决?
public class SmartListView : ListView
{
public SmartListView() : base()
{
ChildAdded += Resize;
}
private void Resize(object sender, ElementEventArgs e)
{
HeightRequest = Height + ((ViewCell)sender).Height;
}
}
然而,回调Resize
永远不会被击中。
答案 0 :(得分:4)
订阅ObservableCollection
的CollectionChanged,如下所示:
MyObservableCollection.CollectionChanged += (sender, e) =>
{
var adjust = Device.OS != TargetPlatform.Android ? 1 : -MyObservableCollection.Count + 1;
myListView.HeightRequest = (MyObservableCollection.Count * myListView.RowHeight) - adjust;
};
答案 1 :(得分:0)
我遇到了类似的问题但是使用了Xamarin.Android。我仍然会发布我的解决方案,但我无法保证它会使用Forms。
此代码根据ListView的内容计算高度,方法是将所有子项的高度相加,然后将其应用于ListView本身。
编辑:不直接使用Xamarin.Forms,因为适配器似乎特定于Xamarin.Android。由于我从未使用过Xamarin.Forms,因此无法修改我的代码,但您可以将其用作基础。您将需要调整代码以某种方式将子项视为视图,然后进行高度计算。
public static void SetListViewHeightBasedOnChildren(ListView list)
{
var adapter = list.Adapter;
if (adapter == null) {
return;
}
int height = 0;
for (int i = 0; i < adapter.Count; i++) {
View listItem = adapter.GetView(i, null, list);
listItem.Measure(0, 0);
height += listItem.MeasuredHeight;
}
ViewGroup.LayoutParams parameters = list.LayoutParameters;
parameters.Height = height + (list.DividerHeight * adapter.Count);
list.LayoutParameters = parameters;
}
将视图添加到视图时,可以调用此代码。但是从未使用过ChildAdded事件。您可能希望在添加子项后尝试手动调用此方法。