如何扩展ListView以自动调整自身大小?

时间:2016-07-11 09:41:02

标签: listview xamarin xamarin.forms

在发现没有明确的方法来调整ListView以适应内容之后,我决定扩展ListView以在每次添加子项时调整自身大小。我试过这段代码,但它没有用。可能是什么问题呢?我该如何解决?

public class SmartListView : ListView
{
    public SmartListView() : base()
    {
        ChildAdded += Resize;
    }

    private void Resize(object sender, ElementEventArgs e)
    {
        HeightRequest = Height + ((ViewCell)sender).Height;
    }
}

然而,回调Resize永远不会被击中。

2 个答案:

答案 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事件。您可能希望在添加子项后尝试手动调用此方法。