iOS not able to set ListView Cell Height

Hi,
I'm trying to set Height for cells inside ListView and it works great for Android and WP, but it doesn't work on iOS.
When using HasUnevenRows, RenderedHeight is always 40, but if I set it to false and define RowHeight it works - the problem is that I need different row height based on some rule of mine.
Does anybody have any idea how to fix this?

I've stripped my code to bare minimums and here it is:

        public class App
        {
            public static Page GetMainPage()
            {
                var list = new List<int>() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

                var listView = new ListView()
                {
                    HasUnevenRows = true,
                    ItemsSource = list,
                    ItemTemplate = new DataTemplate(() =>
                    {
                        return new ViewCell()
                        {
                            Height = 200.0,
                            View = new Label() {Text = "abc"}
                        };
                    })        
                };        
                return new ContentPage() {Content = listView};        
            }
        }

Thanks :)

Posts

  • FredyWengerFredyWenger CHInsider ✭✭✭✭✭

    @IvanCuljak‌ :
    (Very!) unfortunately HasUnevenRows don't work in iOS ).
    With HasUnevenRows the correct Hight would be calculated correct automatically depending on content.
    I have implemented a (bad!) workaround for this problem in iOS -> see code below.

    In the code, I use the OnBindingContextChanged()-event to overtake some text from the selected item and the set the Hight of the cell depending on the length of the text.
    Not nice (it also flickers a bit at runtime) but it seems, as there is no other workaround yet...
    Hope this helps....

      protected override void OnBindingContextChanged()
                {
                    base.OnBindingContextChanged();
                    var oEmpfehlung = (GV.Empfehlung)BindingContext; // Aktuelles Empfehlungsobjekt in oEMpfehlung übernehmen, um die Länge der Angebote auszuwerten und die Höhe dynamisch zu setzen
    
                    if (Device.OS == TargetPlatform.iOS)
                    {
                        int BasisHoehePhone = 420; // Angepasst: 03.11.2014 390 -> 420
                        int BasisHoehePad = 300; // Angepasst: 03.11.2014 390 -> 300
                        //
                        // Zuschlag-Variablen zurücksetzen
                        //
                        int ZuschlagHoehePhone = 0;
                        int ZuschlagHoehePad = 0;
                        //
                        // Anzahl Zeilen in Adresse ermitteln und - wenn grösser als 3 (max 4) -> Zuschlag rechnen
                        //
                        string Adresse = oEmpfehlung.cAdresse;
                        string Suchstring = "\r\n";
                        //
                        int i = 0;
                        int AnzahlZeilen = 1;
                        while ((i = Adresse.IndexOf(Suchstring, i)) != -1)
                        {
                            i = i + 1; // Start-Zeichen für nächste Suche um eins hochsetzen
                            AnzahlZeilen = AnzahlZeilen + 1;
                        }
                        if (AnzahlZeilen > 3)
                        {
                            ZuschlagHoehePhone = ZuschlagHoehePhone + 20;
                            ZuschlagHoehePad = ZuschlagHoehePad + 20;
                        }
                        //
                        // Zuschlag für Slogan-Label setzen -> sobald ein Text erfasst ist -> "Grundzuschlag"
                        //
                        if (oEmpfehlung.cAnbieterSlogan !="")
                        {
                            ZuschlagHoehePhone = ZuschlagHoehePhone + 20;
                            ZuschlagHoehePad = ZuschlagHoehePad + 15;
                        }
                        if (Device.Idiom == TargetIdiom.Phone)
                        {
                            if (oEmpfehlung.cAnbieterSlogan.Length > 27) // ab 27 Zeichen Zuschlag rechnen
                            { ZuschlagHoehePhone = ZuschlagHoehePhone + 20; }
                        }
                        else // iPad
                        {
                            if (oEmpfehlung.cAnbieterSlogan.Length > 50) // erst ab 50 Zeichen Zuschlag rechnen
                            { ZuschlagHoehePad = ZuschlagHoehePad + 30; }
                        }
                        //
                        // Zuschlag für Angebote-Label setzen
                        //
                         if (oEmpfehlung.cAngebote.Length > 150)
    
                            if (Device.Idiom == TargetIdiom.Phone)
                            { ZuschlagHoehePhone = ZuschlagHoehePhone + 200; }
                            else // iPad
                            { ZuschlagHoehePad = ZuschlagHoehePad + 100; }
                        else if (oEmpfehlung.cAngebote.Length > 130)
                            if (Device.Idiom == TargetIdiom.Phone)
                            { ZuschlagHoehePhone = ZuschlagHoehePhone + 100; }
                            else  // IPad
                            { ZuschlagHoehePad = ZuschlagHoehePad + 50; }
                        else if (oEmpfehlung.cAngebote.Length > 45)
                            if (Device.Idiom == TargetIdiom.Phone)
                            { ZuschlagHoehePhone = ZuschlagHoehePhone + 50; }
                       //
                        if (Device.Idiom == TargetIdiom.Phone)
                        { this.Height = BasisHoehePhone + ZuschlagHoehePhone; }
                        else
                        { this.Height = BasisHoehePad + ZuschlagHoehePad; }
                    }
    
                }
    
  • JohnMillerJohnMiller USForum Administrator, Xamarin Team Xamurai

    @IvanCuljak‌

    Make sure your Xamarin.Forms NuGet package is up to date in your PCL and iOS projects. This code works fine with Xamarin.Forms 1.2.3.6257.

  • TuneITTuneIT HRMember

    @FredyWenger thank you for your solution :)
    Currently I don't need iOS to automatically set my cell height, because I have three cases with fixed, but different heights. I'll surely use your code in the future ;)

    @John this solved my problem. I wasn't expecting an older version to be a problem, since I fresh installed Xamarin Studio on my Mac a week ago and it was up to date yesterday when I created my first project in it, but for some reason it was using an old Xamarin.Forms package - v.1.0.xxx

    Thanks to both of you.

  • FredyWengerFredyWenger CHInsider ✭✭✭✭✭

    @IvanCuljak:
    Your welcome :-)

Sign In or Register to comment.