1
resposta

Como atualizar um item em tempo real na tela do usuário sem duplicar o android com firebase

Estou criando para estudo um app de chat usando o firebase-real time, na tela onde lista todas as conversas iniciadas aparece a foto,nome,ultima mensagem de quem mandou, o problema esta ae na ultima mensagem, quando o usuario me manda novas mensagens em vez de atualizar ele fica duplicando,nao reconhece que ja tem uma conversa iniciada. segue uma imagem do problema:

https://drive.google.com/file/d/19zuums0PUca_tS8ciMu3j4o6RPmliKJ9/view?usp=sharing

quero deixa igual do whatz que voce consegue ler a ultima mensagem que o usuario mandou,antes de voce clicar para abrir o chat.

Estou usando o addChildEventListener e carregando os itens com o onChildAdded e atualizando com onChildChanged.

onde carrega as conversas

public void RecuperarConversa(){
    //    listaConversas.clear();
childEventListenerConversas =  conversasRef.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
           //Recuperar Conversa
                Conversa conversa=dataSnapshot.getValue(Conversa.class);
                listaConversas.add(conversa);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                Conversa conversa=dataSnapshot.getValue(Conversa.class);
                Iterator<Conversa> con= listaConversas.iterator();
                while (con.hasNext()){
                    Conversa conValue = con.next();
                    Log.i("sds","baixo");
                    if(conValue.equals(conversa))con.remove();
                }
                listaConversas.add(conversa);
                adapter.notifyDataSetChanged();


            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {


            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

meu adaptador

@Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
    Conversa conversa = conversas.get(position);

    holder.ultimaMensagem.setText(conversa.getUltimaMensagem());

       if(conversa.getIsGroup().equals("true")){
           Grupo grupo = conversa.getGrupo();
           holder.nome.setText(grupo.getNome());
           if(grupo.getFoto()!=null){
               Uri uri=Uri.parse(grupo.getFoto());
               Glide.with(context)
                       .load(uri)
                       .into(holder.foto);
           }else{
               holder.foto.setImageResource(R.drawable.padrao);
           }
       }else{
           Usuario usuario= conversa.getUsuarioExibicao();
           if(usuario!=null){
               holder.nome.setText(usuario.getNome());

               if(usuario.getFoto()!=null){
                   Uri uri=Uri.parse(usuario.getFoto());
                   Glide.with(context)
                           .load(uri)
                           .into(holder.foto);
               }else{
                   holder.foto.setImageResource(R.drawable.padrao);
               }
           }

       }

    }

peguei isso na net e tentei mais sem sucesso:

Iterator<Conversa> con= listaConversas.iterator();
                while (con.hasNext()){
                    Conversa conValue = con.next();
                    if(conValue.equals(conversa))con.remove();
                }
1 resposta

Oi Marlos, tudo bem ?

Uma solução é você utilizar uma estratégia local pra exibir os dados, tudo que vier do servidor você tem meio que um filtro pra saber o que já mostrou ou não, talvez salvar num bd local pra saber.