Data returns after view presentation

Asked

Viewed 53 times

0

The Firebase query seems to return the data after generating the view, so it appears empty, but the data is populated in the log. What could I be doing wrong?

    public class ConsultarActivity extends Activity
    {

        //CRIANDO UM OBJETO DO TIPO ListView PARA RECEBER OS REGISTROS DE UM ADAPTER
        ListView listViewCompras;

        //CRIANDO O BOTÃO VOLTAR PARA RETORNAR PARA A TELA COM AS OPÇÕES
        Button buttonVoltar;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_consultar);

            //VINCULANDO O LISTVIEW DA TELA AO OBJETO CRIADO
            listViewCompras = (ListView)this.findViewById(R.id.listViewCompras);

            //CHAMA O MÉTODO QUE CARREGA AS PESSOAS CADASTRADAS NA BASE DE DADOS
            this.CarregarPessoasCadastradas();

        }


        //MÉTODO QUE CONSULTA AS PESSOAS CADASTRADAS
        protected  void CarregarPessoasCadastradas(){

            ComprasRepository comprasRepository =  new ComprasRepository(this);

            //BUSCA AS PESSOAS CADASTRADAS
            List<ParcelaCartao> compras = comprasRepository.SelecionarTodos(this);

            Log.v("info","compras em carregarpessoascadastradas: " + compras.toString());

// at this point the log shows the empty list.

            //SETA O ADAPTER DA LISTA COM OS REGISTROS RETORNADOS DA BASE
            listViewCompras.setAdapter(new LinhaConsultarAdapter(this, compras));
        }


}


    public class ComprasRepository
    {

        //DatabaseUtil databaseUtil;
        Firebase ref;

        /***
        e * CONSTRUTOR
         * @param context
         */
        public ComprasRepository(Context context){

            //Firebase.setAndroidContext(context);

            //Log.v("info","Firebase.setAndroidContext");


        }


        /***
         * CONSULTA TODAS AS compras CADASTRADAS NA BASE
         * @return
         */
    public List<ParcelaCartao> SelecionarTodos(Context context){ 

            Firebase.setAndroidContext(context);

            final List<ParcelaCartao> compras = new ArrayList<ParcelaCartao>();

            ref = new Firebase(Config.FIREBASE_URL + "/Compras");

            Log.v("info", "ref: " + ref.toString());

            Query query = ref.orderByKey();

            Log.v("info","query: "+ query.toString());

            query.addValueEventListener(new ValueEventListener() {

                    @Override
                    public void onDataChange(DataSnapshot p1)
                    {

                        Log.v("info","ondatachange: ");

                        // TODO: Implement this method
                        if (p1.exists()){

                            Log.v("info","p1 existe ");
                            ParcelaCartao parcelacartao = new ParcelaCartao();

                            for (DataSnapshot childSnapshot : p1.getChildren())
                            {

                                parcelacartao= childSnapshot.getValue(ParcelaCartao.class);     

                                compras.add(parcelacartao);
                                Log.v("info","compras: " + parcelacartao.toString());

              //As informações retornam neste ponto mas após a exibição da view.

                            }

                        }else
                            Log.v("info","p1 nao existe ");

                    }

                @Override
                public void onCancelled(FirebaseError p1)
                {
                    // TODO: Implement this method
                    Log.v("warn", p1.getMessage());
                }


                    });
            return compras;
            }

    }   



    public class LinhaConsultarAdapter extends BaseAdapter
    {

        //CRIANDO UM OBJETO LayoutInflater PARA FAZER LINK A NOSSA VIEW(activity_linha_consultar.xml)
        private static LayoutInflater layoutInflater = null;

        //CRIANDO UMA LISTA DE parcelas
        List<ParcelaCartao> parcelascartao =  new ArrayList<ParcelaCartao>();

        //CIRANDO UM OBJETO DA NOSSA CLASSE QUE FAZ ACESSO AO BANCO DE DADOS
        ComprasRepository  comprasRepository;

        //CRIANDO UM OBJETO DA NOSSA ATIVIDADE QUE CONTEM A LISTA
        private ConsultarActivity consultarActivity;

        //CONSTRUTOR QUE VAI RECEBER A NOSSA ATIVIDADE COMO PARAMETRO E A LISTA DE compras QUE VAI RETORNAR
        //DA NOSSA BASE DE DADOS
    public LinhaConsultarAdapter(ConsultarActivity consultarActivity, List<ParcelaCartao> parcelascartao ) {

            this.parcelascartao       =  parcelascartao;
            this.consultarActivity  =  consultarActivity;
            this.layoutInflater     = (LayoutInflater) this.consultarActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            this.comprasRepository   = new ComprasRepository(consultarActivity);
        }

        //RETORNA A QUANTIDADE DE REGISTROS DA LISTA
        @Override
        public int getCount(){

            return parcelascartao.size();
        }

        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }

        //ESSE MÉTODO SETA OS VALORES DE UM ITEM DA NOSSA LISTA  PARA UMA LINHA DO NOSSO LISVIEW
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {


            //CRIANDO UM OBJETO DO TIPO View PARA ACESSAR O NOSSO ARQUIVO DE LAYOUT activity_linha_consultar.xml
            final View viewLinhaLista = layoutInflater.inflate(R.layout.activity_linha_consultar,null);

            //VINCULANDO OS CAMPOS DO ARQUIVO DE LAYOUT(activity_linha_consultar.xml) AOS OBJETOS DECLARADOS.

            //CAMPO QUE VAI MOSTRAR O valor da compra
            TextView textViewValorCompra        = (TextView) viewLinhaLista.findViewById(R.id.textViewValCompra);

            //CAMPO QUE VAI MOSTRAR a data da compra
            TextView textViewDataCompra           = (TextView) viewLinhaLista.findViewById(R.id.textViewDataCompra);

            //CAMPO QUE VAI MOSTRAR a descrição
            TextView textViewDescCompra       = (TextView) viewLinhaLista.findViewById(R.id.textViewDescCompra);

            //CAMPOS QUE VAI MOSTRAR numro de parcelas
            TextView textViewNumParcelas           = (TextView) viewLinhaLista.findViewById(R.id.textViewNumParcelas);


            //CRIANDO O BOTÃO  EXCLUIR PARA DELETARMOS UM REGISTRO DO BANCO DE DADOS
            Button buttonExcluir             = (Button)   viewLinhaLista.findViewById(R.id.buttonExcluir);

            //SETANDO valor da compra NO CAMPO DA NOSSA VIEW
                textViewValorCompra.setText(String.valueOf(parcelascartao.get(position).getValor()));


            //SETANDO a data da compra NO CAMPO DA NOSSA VIEW
                    textViewDataCompra.setText(String.valueOf(parcelascartao.get(position).getDatacompra()));


            //SETANDO a descrição NO CAMPO DA NOSSA VIEW
                    textViewDescCompra.setText(String.valueOf(parcelascartao.get(position).getDescricao()));

            textViewNumParcelas.setText(String.valueOf(parcelascartao.get(position).getParcelas()));


            //CRIANDO EVENTO CLICK PARA O BOTÃO DE EXCLUIR REGISTRO
            buttonExcluir.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {


                        //EXCLUINDO UM REGISTRO
                        comprasRepository.Excluir(String.valueOf(parcelascartao.get(position).getKey()));

                        //MOSTRA A MENSAGEM APÓS EXCLUIR UM REGISTRO
                        Toast.makeText(consultarActivity, "Registro excluido com sucesso!", Toast.LENGTH_LONG).show();

                        //CHAMA O MÉTODO QUE ATUALIZA A LISTA COM OS REGISTROS QUE AINDA ESTÃO NA BASE
                        AtualizarLista();

                    }
                });


            return viewLinhaLista;
        }


        //ATUALIZA A LISTTA DEPOIS DE EXCLUIR UM REGISTRO
        public void AtualizarLista(){

            this.parcelascartao.clear();
            //this.parcelascartao = comprasRepository.SelecionarTodos(this);
            this.notifyDataSetChanged();
        }


    }

1 answer

0

This is because Firebase performs the readings asynchronously. This means that when you return to the Shopping List, it has not yet been initialized. Do not create a separate class for the Repository. Do all operations in your Activity.

Your problem can be solved by passing the reading to the method CarregarPessoasCadastradas():

//MÉTODO QUE CONSULTA AS PESSOAS CADASTRADAS
        protected  void CarregarPessoasCadastradas(){

            Firebase.setAndroidContext(context);

            final List<ParcelaCartao> compras = new ArrayList<ParcelaCartao>();

            Firebase ref = new Firebase(Config.FIREBASE_URL + "/Compras");

            Log.v("info", "ref: " + ref.toString());

            Query query = ref.orderByKey();

            Log.v("info","query: "+ query.toString());

            query.addValueEventListener(new ValueEventListener() {

                    @Override
                    public void onDataChange(DataSnapshot p1)
                    {

                        Log.v("info","ondatachange: ");

                        // TODO: Implement this method
                        if (p1.exists()){

                            Log.v("info","p1 existe ");
                            ParcelaCartao parcelacartao = new ParcelaCartao();

                            for (DataSnapshot childSnapshot : p1.getChildren())
                            {

                                parcelacartao= childSnapshot.getValue(ParcelaCartao.class);     

                                compras.add(parcelacartao);
                                Log.v("info","compras: " + parcelacartao.toString());

              //As informações retornam neste ponto mas após a exibição da view.

                            }
                            //SETA O ADAPTER DA LISTA COM OS REGISTROS RETORNADOS DA BASE
                            listViewCompras.setAdapter(new LinhaConsultarAdapter(this, compras));

                        }else
                            Log.v("info","p1 nao existe ");

                    }

                @Override
                public void onCancelled(FirebaseError p1)
                {
                    // TODO: Implement this method
                    Log.v("warn", p1.getMessage());
                }


                    });

        }

Browser other questions tagged

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