Saltar al contenido

¿Tamaño de ListView de Xamarin.Forms al contenido?

Posterior a de nuestra prolongada búsqueda de información resolvimos este dilema que suelen tener ciertos los lectores. Te brindamos la respuesta y deseamos servirte de gran ayuda.

Solución:

Basado en la respuesta de Lutaaya, hice un comportamiento que automatiza esto, determinando y configurando la altura de la fila (Gist).

Conducta:

namespace Xamarin.Forms

  using System;
  using System.Linq;
  public class AutoSizeBehavior : Behavior
  
    ListView _ListView;
    ITemplatedItemsView Cells => _ListView;

    protected override void OnAttachedTo(ListView bindable)
    
      bindable.ItemAppearing += AppearanceChanged;
      bindable.ItemDisappearing += AppearanceChanged;
      _ListView = bindable;
    

    protected override void OnDetachingFrom(ListView bindable)
    
      bindable.ItemAppearing -= AppearanceChanged;
      bindable.ItemDisappearing -= AppearanceChanged;
      _ListView = null;
    

    void AppearanceChanged(object sender, ItemVisibilityEventArgs e) =>
      UpdateHeight(e.Item);

    void UpdateHeight(object item)
    
      if (_ListView.HasUnevenRows)
      
        double height;
        if ((height = _ListView.HeightRequest) == 
            (double)VisualElement.HeightRequestProperty.DefaultValue)
          height = 0;

        height += MeasureRowHeight(item);
        SetHeight(height);
      
      else if (_ListView.RowHeight == (int)ListView.RowHeightProperty.DefaultValue)
      
        var height = MeasureRowHeight(item);
        _ListView.RowHeight = height;
        SetHeight(height);
      
    

    int MeasureRowHeight(object item)
    
      var template = _ListView.ItemTemplate;
      var cell = (Cell)template.CreateContent();
      cell.BindingContext = item;
      var height = cell.RenderHeight;
      var mod = height % 1;
      if (mod > 0)
        height = height - mod + 1;
      return (int)height;
    

    void SetHeight(double height)
    
      //TODO if header or footer is string etc.
      if (_ListView.Header is VisualElement header)
        height += header.Height;
      if (_ListView.Footer is VisualElement footer)
        height += footer.Height;
      _ListView.HeightRequest = height;
    
  

Uso:


  
    
      

Ok Suponga que su ListView está poblado con NewsFeeds, usemos un ObservableCollection para contener nuestros datos para poblar un ListView como se muestra a continuación:

Código XAML:


Código C #

ObservableCollection  trends = new ObservableCollection();

Luego, asigna la lista de tendencias a ListView:

newslist.ItemSource = trends;

Luego, hemos creado algo de lógica en ListView y los datos, para que ListView envuelva los datos, a medida que aumentan los datos, ListView también aumenta y viceversa :

int i = trends.Count;
int heightRowList = 90;
i = (i * heightRowList);
newslist.HeightRequest = i;

Por tanto, el código completo es:

ObservableCollection  trends = new ObservableCollection();
newslist.ItemSource = trends;
int i = trends.Count;
int heightRowList = 90;
i = (i * heightRowList);
newslist.HeightRequest = i;

Espero eso ayude .

Podría hacer un controlador de eventos que tenga en cuenta el tamaño cambiante de las celdas de ListView. Aquí está:

    
               
                    
                        
                           

El marco se puede cambiar por Grid, StackLayout, etc. xaml.cs:

        static readonly Dictionary> _listViewHeightDictionary = new Dictionary>();

    private void VisualElement_OnSizeChanged(object sender, EventArgs e)
    

    private void ListView_OnSizeChanged(object sender, EventArgs e)
    

Cuando se muestra Frame (se está aplicando ListView.ItemTemplate), el tamaño del marco cambia. Tomamos su altura real a través del método Measure () y la colocamos en Dictionary, que conoce la ListView actual y mantiene la altura de Frame. Cuando se muestra el último cuadro, sumamos todas las alturas. Si no hay elementos, ListView_OnSizeChanged () establece listView.HeightRequest en 0.

Si tienes alguna sospecha y forma de reaccionar nuestro enunciado eres capaz de dejar una crítica y con mucho placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *