private void NovoEstabelecimento_Click(object sender, EventArgs e)
        {
            EditText editTextEstabelecimento = new EditText(this);

            AlertDialog.Builder dialog = new AlertDialog.Builder(this);
            dialog.SetTitle("Nome do Estabelecimento");
            dialog.SetView(editTextEstabelecimento);
            dialog.SetPositiveButton("OK", (senderAlert, args) =>
            {
                var estabelecimento  = new Models.Estabelecimento();
                estabelecimento.Id   = MainActivity.Dados.Estabelecimentos.Max(est => est.Id) + 1;
                estabelecimento.Nome = editTextEstabelecimento.Text;
                MainActivity.Dados.Estabelecimentos.Add(estabelecimento);
                _spinnerEstabelecimento.Adapter = new ArrayAdapter <string>(this, global::Android.Resource.Layout.SimpleSpinnerItem, MainActivity.Dados.Estabelecimentos.Select(est => est.Nome).ToArray());
                _spinnerEstabelecimento.SetSelection(MainActivity.Dados.Estabelecimentos.IndexOf(estabelecimento));
            });
            dialog.SetNegativeButton("Cancelar", (IDialogInterfaceOnClickListener)null);

            dialog.Show();
        }
        protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            if (resultCode == Result.Ok)
            {
                var id       = data.Extras.GetInt("Id");
                var excluido = data.Extras.GetBoolean("Excluido");

                // Se o gasto não foi excluído, vamos atualizá-lo
                if (!excluido)
                {
                    var gasto = Dados.Gastos.FirstOrDefault(g => g.Id == id);

                    // Gasto nulo quer dizer que o usuário está criando um novo gasto.
                    if (gasto == null)
                    {
                        gasto = new Models.Gasto()
                        {
                            Id = 1
                        };
                        if (Dados.Gastos.Any())
                        {
                            gasto.Id = Dados.Gastos.Max(g => g.Id) + 1;
                        }
                        Dados.Gastos.Add(gasto);
                    }

                    var dataAnterior = gasto.Data.Date;
                    var dataNova     = new DateTime(data.Extras.GetLong("Data")).Date;
                    gasto.Data  = dataNova;
                    gasto.Valor = Convert.ToDecimal(data.Extras.GetDouble("Valor"));
                    var nomeEstabelecimento = data.Extras.GetString("Estabelecimento");
                    var estabelecimento     = Dados.Estabelecimentos.FirstOrDefault(e => string.Compare(e.Nome, nomeEstabelecimento, StringComparison.InvariantCultureIgnoreCase) == 0);
                    if (estabelecimento == null)
                    {
                        estabelecimento = new Models.Estabelecimento()
                        {
                            Nome = nomeEstabelecimento
                        };
                    }
                    gasto.Estabelecimento = estabelecimento;

                    // Se a data anterior for diferente da nova, nós precisamos ajustar o pai do gasto na lista de ListViewGroups.
                    if (!dataAnterior.Equals(dataNova))
                    {
                        var listViewGroupAnterior = _listViewGroups.FirstOrDefault(lvg => lvg.Data.Equals(dataAnterior));
                        if (listViewGroupAnterior != null)
                        {
                            listViewGroupAnterior.Gastos.Remove(gasto);
                        }

                        var listViewGroupNovo = _listViewGroups.FirstOrDefault(lvg => lvg.Data.Equals(dataNova));
                        if (listViewGroupNovo == null)
                        {
                            listViewGroupNovo = new ListViewGroup()
                            {
                                Data = dataNova
                            };
                            _listViewGroups.Add(listViewGroupNovo);
                        }
                        listViewGroupNovo.Gastos.Add(gasto);
                        _listViewGroups.Sort((lvg1, lvg2) => lvg1.Data.CompareTo(lvg2.Data));
                    }
                }
                // Se o gasto está sendo excluído, nós temos que removê-lo do ListView também.
                else
                {
                    var listViewGroup = _listViewGroups.FirstOrDefault(lvg => lvg.Gastos.Any(g => g.Id == id));
                    if (listViewGroup != null)
                    {
                        var gasto = listViewGroup.Gastos.First(g => g.Id == id);
                        listViewGroup.Gastos.Remove(gasto);
                    }
                }

                // Notificando que os dados foram alterados para dar um refresh no ListView.
                _adapter.NotifyDataSetChanged();
                ExpandirTodosOsGruposDoListView();

                Dados.Salvar();
            }
        }