XAMARIN - List View with Binding without Information

Asked

Viewed 235 times

2

I’m doing a project with Xamarin.Forms and I have a problem. The project is related to the bus route of my city, but when making the code and playing to the screen, as much as it has BINDING the same does not get to go to the screen, thus leaving the screen empty.

The problem, in question, would be that I am doing Binding, following tutorial of what I really need (link of what I am basing myself to do: https://xamarinhelp.com/xamarin-forms-listview-grouping/), but as much as I make it look like this, adapting it to what I need, my listview is blank no matter how much information I have on Items

Any suggestions of what might be for Binding not working in this case in specific?

From now on, thank you.

List View:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="APPDiretoPonto.View.CalendarioOnibus"
             Title="Horários">
    <!--IsGroupingEnabled="True"  -->
    <ListView x:Name="MyListView"

            ItemsSource="{Binding Items}"
            ItemTapped="Handle_ItemTapped"
            CachingStrategy="RecycleElement">

    <ListView.GroupHeaderTemplate>
        <DataTemplate>
                <ViewCell>
                    <Label Text="{Binding diasCalendario}" TextColor="Black" FontAttributes="Bold" />
                </ViewCell>
            </DataTemplate>
    </ListView.GroupHeaderTemplate>

        <!--Built in Cells-->
    <ListView.ItemTemplate>
        <DataTemplate>
                <TextCell Text="{Binding nomeRotaOnibus}" TextColor="Green" />
                <!--<Label Text="{Binding nomeRotaOnibus}" TextColor="Black" FontAttributes="Bold" />-->
            </DataTemplate>
    </ListView.ItemTemplate>  
  </ListView>
</ContentPage>

Listview code

public partial class CalendarioOnibus : ContentPage
{

    public const string DiasUteis = "Dias Úteis";
    public const string Sabados = "Sábados";
    public const string DomingosFeriado = "Domingos / Feriados";

    public ObservableCollection<rotaOnibuslist> Items { get; set; }                
    public rotaOnibuslist listaHorario = new rotaOnibuslist(); //inicio aqui para poder usar nos métodos que preciso        

    public CalendarioOnibus(int idBairro, string sentido)
    {            
        InitializeComponent();    

        Task.Run(async () => await carregaHorariosVariantes(idBairro, sentido));
    }

    async Task carregaHorariosVariantes(int idBairro, string sentido)
    {
        //web serice            
        serviceLinha service = new serviceLinha();

        listaViagem viagemOnibus = await service.buscaVariantes(); //variantes e rotas  
        PartidaPrincipal partidaOnibus = await service.buscaHorario(); //horário e calendario (dias)                        

        viagemOnibus.viagens.RemoveAll(x => !x.id_linha.Equals(idBairro));//só deixo o bairro filtrado
        viagemOnibus.viagens.RemoveAll(x => !x.sentido.Equals(sentido));//só deixo o sentido filtrado
        viagemOnibus.viagens.OrderBy(x => x.id_viagem); //ordeno pela viagem que já deixo ordenado para mostrar no lsit view           

        partidaOnibus.partidas.OrderBy(x => x.id_viagem); //orderno pela viagem 

        List<rotaOnibuslist> listaOnibusHorario = new List<rotaOnibuslist>();
        //rotaOnibuslist listaOnibusHorario = new rotaOnibuslist();
        rotaOnibuslist listaHorarioDiasUteis = new rotaOnibuslist();
        rotaOnibuslist listaHorarioSabados = new rotaOnibuslist();
        rotaOnibuslist listaHorarioDomingos = new rotaOnibuslist();

        foreach (Viagem viagem in viagemOnibus.viagens)
        {
            //pego o código da viagem e o nome da mesma
            int codigoViagem = viagem.id_viagem;
            string nomeViagem = viagem.nome;

            foreach (Partida partida in partidaOnibus.partidas)
            {
                if (partida.id_viagem == codigoViagem) {

                    foreach (Calendario diasOnibus in partida.calendarios) {
                        //string dias = diasOnibus.calendario;
                        foreach (listaPartida partidaHorario in diasOnibus.partidas) {
                            string horario = partidaHorario.partida;
                            rotaOnibus onibus = new rotaOnibus() { horarioOnibus = horario, rota = nomeViagem };                                
                            string dias = diasOnibus.calendario;

                            switch (dias)
                            {
                                case DiasUteis:
                                    listaHorarioDiasUteis.diasCalendario = dias;
                                    listaHorarioDiasUteis.Add(onibus);
                                    break;
                                case Sabados:
                                    listaHorarioSabados.diasCalendario = dias;
                                    listaHorarioSabados.Add(onibus);
                                    break;
                                case DomingosFeriado:
                                    listaHorarioDomingos.diasCalendario = dias;
                                    listaHorarioDomingos.Add(onibus);
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                }
            }
        }            

        listaOnibusHorario.Add(listaHorarioDiasUteis);
        listaOnibusHorario.Add(listaHorarioSabados);
        listaOnibusHorario.Add(listaHorarioDomingos);

        Items = new ObservableCollection<rotaOnibuslist>(listaOnibusHorario);            
        MyListView.ItemsSource = Items;                        
    }

My classes:

public class Calendario
{
    public string calendario { get; set; }
    public listaPartida[] partidas { get; set; }
}

public class listaPartida
{
    public string idTabela { get; set; }
    public string chegada { get; set; }
    public string partida { get; set; }
}


public class Partida
{
    public Calendario[] calendarios { get; set; }
    public int id_viagem { get; set; }
}

public class PartidaPrincipal
{
    public Partida[] partidas { get; set; }
}

public class Viagem
{
    public object nome_curto { get; set; }
    public string sentido { get; set; }
    public string linha { get; set; }
    public string nome { get; set; }
    public int id_linha { get; set; }
    public int id_viagem { get; set; }
}

public class listaViagem
{
    public List<Viagem> viagens { get; set; }
}

My classes in which I Binding:

public class rotaOnibus
{
    public string horarioOnibus { get; set; }
    public string rota { get; set; }
    public string nomeRotaOnibus
    {
        get
        {
            return $"{horarioOnibus} - {rota}";
        }
    }
}

public class rotaOnibuslist : List<rotaOnibus>
{
    public string diasCalendario { get; set; }
    public List<rotaOnibus> rotaOnibus => this;
}
  • I would recommend you to reduce the amount of information in your question by highlighting more clearly the point where you find the problem.

  • Adjusted the question to clarify the doubt/problem I’m having. Thanks in advance.

1 answer

1

Problem solved.

I will post below in case someone has the same problem:

In my list view I added the property:

IsGroupingEnabled="True"

Thus remaining:

<ListView x:Name="MyListView"
ItemsSource="{Binding Items}"
ItemTapped="Handle_ItemTapped"
CachingStrategy="RecycleElement"
IsGroupingEnabled="True">

At the source, I changed:

listaOnibusHorario.Add(listaHorarioDiasUteis);
listaOnibusHorario.Add(listaHorarioSabados);
listaOnibusHorario.Add(listaHorarioDomingos);
Items = new ObservableCollection<rotaOnibuslist>(listaOnibusHorario);            
MyListView.ItemsSource = Items; 

To:

var list = new List<rotaOnibuslist>()
{
    listaHorarioDiasUteis,
    listaHorarioSabados,
    listaHorarioDomingos
};
MyListView.ItemsSource = list; 

And also, in the method, I added the: base.Onappearing();

public CalendarioOnibus(int idBairro, string sentido)
{            
    InitializeComponent();

    base.OnAppearing();

    Task.Run(async () => await carregaHorariosVariantes(idBairro, sentido));
}  

And then the list appeared just right, as it should.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.