GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Criar notificação após, atualizar RecyclerView, com dados do banco

java
Tags: #<Tag:0x00007f4a27bceaa8>

#1

Como faço para enviar uma notificação local no android usando fragment, quando existir um novo item em uma lista recycler view?


#2

Cara, não entendi bem o “usando um fragment”, mas tu podes criar uma notificação normal, após uma verificação na RecyclerView. Tipo, ao finalizar o incluir, notifica a pessoa

https://developer.android.com/training/notify-user/build-notification#java


#3

Desculpa não ter sido mais claro na pergunta, eu tenho uma activity menu, com uma aba(Fragment) onde possui um recycler view. Se der um delete em um item do banco de dados, como faço para minha lista saber que esse item foi deletado e criar uma notificação?


#4

Ah sim, entendi
Cara, recentemente eu estava mexendo com ListView e me veio essa opção para você testar.

Vê se tá atualizando tua RecyclerView. Faz isso depois de concluir essa exclusão

runOnUiThread(new Runnable() {
    @Override
    public void run() {
           adaptador.notifyDataSetChanged(); // verifica alterações
           // cria notificação aqui
    }
});

#5

Só que o delete é feito por um sistema web no mesmo banco, na lista não tenho opção de deletar. Onde eu poderia por esse trecho de código


#6

Ah sim, então é apenas listagem

Cara, tu pode colocar pra esperar um tempo pra poder verificar.
Tipo, tu faz ele rodar isso aí a cada 30 segundos, por exemplo

Thread.sleep(30000) talvez?

Se o tamanho atual da lista for maior/menor, que a lista nova, então tu notifica o serumano


#7

só mais uma duvida, onde poderia por esse código no Adpter, ViewHolder ou Fragment?


#8

Cara, eu acho que no Fragment…
É nele que tu tá instanciando tua RecyclerView, também é onde tu tá listando as coisas, então acho que fica mais viável/correto


#9

O método runOnUiThread não funciona no fragment, da erro Cannot resolve method, tem outra forma a verificação em background?


#10

Cara, tenta como eu fiz aqui. Eu chamei a classe e depois o método. Vê se consegue algo do tipo (eu estava usando AppCompactActivity, infelizmente não tô com nenhum Fragment pra testar aqui.

O que fiz estava dentro de um Callback, mas tu pode testar em outro lugar, desde que esteja dentro de algum método e seja depois de uma possível atualização na tua RecyclerView


#11

Continua o mesmo erro


#12

Complicado… Cara, desculpa, não me vem nada à mente pra testar :T
Penso que a lógica seria

  1. Criar verificação no banco
  2. Atualizar RecyclerView sempre que verificar o banco
  3. Fazer essa verificação a cada tempo determinado (ex.: de 5 em 5 segundos, atualizar o RecyclerView com os dados do banco)
  4. Se a quantidade de itens antes da atualização for maior que a quantidade atual, então criar notificação

:T


#13

Consegui resolver usando Service, vo deixar o código caso alguem passe pelo mesmo problema

primeiro criei uma classe que estende a classe Service (Classe responsável por executar processos em background)

public class Servico extends Service {


private PendingIntent getPendingIntent(int id, Intent intent, Context context){
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(intent.getComponent());
    stackBuilder.addNextIntent(intent);

    PendingIntent p = stackBuilder.getPendingIntent(id, PendingIntent.FLAG_UPDATE_CURRENT);
    return p;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.e(TAG, "onStartCommand");
            boolean ok = true;
            while (ok == true) {
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                FragmentPromocao fragmentPromocao = new FragmentPromocao();
                ArrayList<Produtos> lista;
                lista = fragmentPromocao.buscarProdutos();

                if (lista.size() > getLista()) {
                    int id = 1;
                    String titulo = "Título da Notificação";
                    String texto = "Texto da notificação Simples";
                    int icone = android.R.drawable.ic_dialog_info;

                   Intent intent = new Intent(getBaseContext(), MenuActivity.class);
                    PendingIntent p = getPendingIntent(id, intent, getBaseContext());

                    NotificationCompat.Builder notificacao = new NotificationCompat.Builder(getBaseContext());
                    notificacao.setSmallIcon(icone);
                    notificacao.setContentTitle(titulo);
                    notificacao.setContentText(texto);
                    notificacao.setContentIntent(p);

                    NotificationManagerCompat nm = NotificationManagerCompat.from(getBaseContext());
                    nm.notify(id, notificacao.build());
                } else {
                }
                //Toast.makeText(getApplicationContext(), "Serviço", Toast.LENGTH_LONG).show();

            }
        }
    }).start();

    // START_STICKY serve para executar seu serviço até que você pare ele, é reiniciado automaticamente sempre que termina
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
        }
   }

Na Adapter da minha lista criei um método estático que retorna o tamanho da lista atual sem precisar instaciar a classe(Pois para instanciar a classe precisaria passar uma lista no construtor, que no caso, seria a lista que eu iria usar na comparação, e que seria retornado no método estatico)

public static int getLista() {
   return mLista.size();
}

depois chamei o metódo startService() no método onCreate da activity main, esse chamada executa o metodo onStartCommand() da classe service, como o método esta dentro de uma thread não vai inteferir na execução do app

Obrigado Chaybelucas pela ajuda.