3
respostas

Lista de Refeições não atualiza.

Depois de terminar o módulo de MVVM. A View que lista as refeições salvas não atualiza de forma automática.

<?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="Nutricao.ListaRefeicoes" Title="Listagem das refeições">
    <ContentPage.Content>
        <StackLayout Padding="25">
        <ListView ItemsSource="{Binding Refeicoes}" ItemTapped="AcaoItem">>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <StackLayout>
                                <Label Text="{Binding Descricao}" FontSize="12" />
                                       <StackLayout Orientation="Horizontal">
                                        <Label Text="Calorias:" FontSize="10" />
                                        <Label Text="{Binding Caloria}" FontSize="10" />
                                    </StackLayout>
                                </StackLayout>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Xamarin.Forms;

namespace Nutricao
{
    public partial class ListaRefeicoes : ContentPage
    {
        public ObservableCollection<Refeicao> Refeicoes { get; set; }

        private RefeicaoDAO dao;

        public ListaRefeicoes(RefeicaoDAO dao)
        {
            BindingContext = this;
            this.dao = dao;
            Refeicoes = dao.Lista;
            InitializeComponent();
        }

        public async void AcaoItem(Object sender, ItemTappedEventArgs e) {

            var refeicao = e.Item as Refeicao;

            var resposta = await DisplayAlert("Confirmação", 
                                              $"Tem certeza que deseja remover a refeição {refeicao.Descricao}?", 
                                              "SIM", "Não");
            if (resposta) { 
                dao.Remove(refeicao);
                await DisplayAlert("Sucesso", "Refeição removida com sucesso", "OK");
            }
        }
    }
}
using System;
using System.Collections.ObjectModel;
using SQLite;

namespace Nutricao
{
    public class RefeicaoDAO
    {
        private SQLiteConnection conexao;
        private ObservableCollection<Refeicao> lista;
        public ObservableCollection<Refeicao> Lista
        {
            get {
                if (lista == null)
                    lista = GetAll();

                return lista;
            }
            set {
                lista = value;
            }
        }

        public RefeicaoDAO(SQLiteConnection con)
        {
            this.conexao = con;
            this.conexao.CreateTable<Refeicao>();
        }

        public void Salvar(Refeicao refeicao)
        {
            conexao.Insert(refeicao);
        }

        public ObservableCollection<Refeicao> GetAll()
        {
           return new ObservableCollection<Refeicao>(conexao.Table<Refeicao>());
        }

        public void Remove(Refeicao refeicao)
        {
            this.conexao.Delete<Refeicao>(refeicao.ID);
            lista.Remove(refeicao);
        }
    }
}
3 respostas

Olá, Bruno!

No seu código está faltando a instrução para adicionar a nova refeição na lista de refeições:

        public void Salvar(Refeicao refeicao)
        {
            conexao.Insert(refeicao);
            lista.Add(refeicao); //faltou esta linha!
        }

Um abraço

Fala aí Bruno Blz?

Acho que faltou você adicionar a refeição na lista após inserir no banco.

Tente mudar seu método Salvar para esse:

public void Salvar(Refeicao refeicao)
{
     conexao.Insert(refeicao);
    lista.Add(refeicao);
}

Espero ter ajudado!

Estou com o mesmo problema depois que fiz o ultimo vídeo do capitulo 4.

using Alura.Data;
using SQLite;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection.Emit;
using System.Text;

using Xamarin.Forms;

namespace Alura
{
    public class HomeTabbedPage : TabbedPage
    {
        public HomeTabbedPage()
        {
            var con = DependencyService.Get<ISqlite>().GetConnection(); 

            RefeicaoDAO dao = new RefeicaoDAO(con);

            ListaRefeicoes telaLista = new ListaRefeicoes(dao);
            CadastroRefeicao telaCadastro = new CadastroRefeicao(dao);

            this.Children.Add(telaLista);
            this.Children.Add(telaCadastro);
        }
    }
}


using Alura.Data;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace Alura
{
    public partial class CadastroRefeicao : ContentPage
    {
        private RefeicaoDAO dao;

        internal CadastroRefeicao(RefeicaoDAO dao)
        {
            this.dao = dao;
            InitializeComponent();
        }

        public void AtualizaContador(Object sender, EventArgs e)
        {
            double valor = stpCalorias.Value;

            lblCalorias.Text = valor.ToString();
        }

        public void SalvaRefeicao(Object sender, EventArgs e)
        {
            string descricao = entDescricao.Text;
            double valor = stpCalorias.Value;

            Refeicao refeicao = new Refeicao(descricao, valor);
            dao.Salvar(refeicao);

            string mensagem = "A refeição " + descricao + " de " + valor + " calorias foi salva com sucesso";

            DisplayAlert("Salvar refeição", mensagem, "OK");
            Clear();
        }

        public void Clear()
        {
            entDescricao.Text = "";
            stpCalorias.Value = 0;
        }
        /*
        public void MostraLista(Object sender, EventArgs e)
        {
            ListaRefeicoes tela = new ListaRefeicoes();

            Navigation.PushAsync(tela);
        }
        */
    }
}
using SQLite;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alura.Data
{
    class RefeicaoDAO
    {
        private SQLiteConnection conexao;
        private ObservableCollection<Refeicao> lista;

        public ObservableCollection<Refeicao> Lista
        {
            get
            {
                if(lista == null)
                {
                    lista = GetAll();
                }
                return lista;
            }
            private set
            {
                lista = value;
            }
        }

        public RefeicaoDAO(SQLiteConnection con)
        {
            conexao = con;
            conexao.CreateTable<Refeicao>();
        }

        public void Salvar(Refeicao refeicao)
        {
            conexao.Insert(refeicao);
            lista.Add(refeicao);
        }

        public void Remove(Refeicao refeicao)
        {
            conexao.Delete<Refeicao>(refeicao.ID);
            lista.Remove(refeicao);
        }

        private ObservableCollection<Refeicao> GetAll()
        {
            return new ObservableCollection<Refeicao>(conexao.Table<Refeicao>());
        }


    }
}
using Alura.Data;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace Alura
{
    public partial class ListaRefeicoes : ContentPage
    {
        private ObservableCollection<Refeicao> Refeicoes { get; set; }
        private RefeicaoDAO dao;

        internal ListaRefeicoes(RefeicaoDAO dao)
        {
            BindingContext = this;
            this.dao = dao;
            Refeicoes = dao.Lista;
            InitializeComponent();
        }

        public async void ExcluirRefeicao(object sender, ItemTappedEventArgs e)
        {
            Refeicao refeicao = e.Item as Refeicao;

            var resposta = await DisplayAlert("Remover item", "Você tem certeza que deseja remover a refeição" + refeicao.Descricao, "Sim", "Não");

            if (resposta)
            {
                dao.Remove(refeicao);

                await DisplayAlert("Remover item", "Refeição removida com sucesso", "OK");
            }
        }
    }
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software