概要

Xamarin.Formsでリスト表示を行うものとして、ListViewがあります。

ListViewでは、アイテムの高さが変更された場合に、自動で高さが変わるというわけではありません。

そのため、手動で高さを変更する必要するあります。

ここでは、ListViewにおけるアイテムの高さの動的な変更方法を紹介します。

環境

  • Xamarin.Forms 4.5.0.530
  • iOS 13.4

解決方法と新たな問題

ListViewの高さを動的に変更するためには、ForceUpdateSizeメソッドを実行します。ForceUpdateSizeメソッドでは、アイテムの高さを自動で計算して、その高さに調節します。

public partial class SizeUpdatingViewCell : ViewCell
{
    public SizeUpdatingViewCell()
    {
        InitializeComponent();
    }

    public void OnTapped()
    {
        base.OnTapped();
        // ここに、アイテムの高さが変わる処理を記述
        ForceUpdateSize();
    }
}

ForceUpdateSizeメソッドは、ViewCellで定義されています。そのため、私はメソッドを呼び出すために、VIewCellを継承したクラスを作成して、そのクラスをListViewのViewCellで使用しています。

ForceUpdateSizeメソッドを呼び出すことで、高さを自動で設定することができるのですが、iOSにおいて何度かForceUpdateSizeメソッドを実行していると、動作はするのですがフリーズが発生して、長時間操作ができないという問題が発生しました。

フリーズの対処方法

フリーズの原因を調べると、ListViewのiOSにおけるキャッシュ機構に原因があるということのようです。

そのため、ListViewのキャッシュ機構を変更します。

<ListView CachingStrategy="RecycleElement" />

これで、iOSにおけるフリーズの問題が解決しました。

さいごに

ForceUpdateSizeメソッドを使えば高さを変更できるという情報は簡単に見つけられるのですが、フリーズの問題の解決にハマってしまいました。

クロスプラットフォームにはクロスプラットフォームの大変な部分があるという、いい経験になりました。