Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Implementar o recyclerview utilizando asynctask para buscar no sqlite.

Estou com duvida de como implementar o RecyclerView. Configurei o SQLite com o RoomDatabase. E criei as classes Asynctask para poder executar as funções do Dao. Mas não estou conseguindo implementar o Recycler com a lista que retorna da asynctask que procura por todos os itens. Tentei fazer no onPostExecute que recebe essa lista do Dao, mas não deu certo. Segue o link do git:

https://github.com/renanparis/Lista_Pedidos.git

o ultimo commit foi quando comecei a rodar o dao na thread principal para testar se estava salvando e buscando no banco de dados.

6 respostas

Oi Renan, tudo bem? Basicamente você precisa configurar um listener/callback para que no momento que chegar no onPostExecute() o resultado atualize o RecyclerView. Nesta aula do segundo curso de Room explico como faz essa implementação.

Oi Alex, blz? Eu implementei um listener para poder recuperar. Aparentemente funcionou e trouxe todos os itens. Mas esta mostrando essa mensagem no log: om.paris.hayorders E/RecyclerView: No adapter attached; skipping layout.

package com.paris.hayorders.activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.paris.hayorders.R;
import com.paris.hayorders.asynctask.SearchAllCustomers;
import com.paris.hayorders.dao.CustomerDao;
import com.paris.hayorders.database.CustomerDatabase;
import com.paris.hayorders.model.Customers;
import com.paris.hayorders.recyclerview.CustomersRecyclerAdapter;

import java.util.List;

public class CustomerListActivity extends AppCompatActivity {

    private RecyclerView customerList;
    private CustomerDao dao;
    private CustomersRecyclerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_customer_list);
        CustomerDatabase db = CustomerDatabase.getInstance(this);
        dao = db.customerDao();
        configList();
        configFabAddCustomer();

    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    private void configRecyclerAdapter(List<Customers> customers) {
        customerList = findViewById(R.id.customer_list);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        customerList.setLayoutManager(layoutManager);
        adapter = new CustomersRecyclerAdapter(customers, this);
        customerList.setAdapter(adapter);
    }

    private void configList() {

        new SearchAllCustomers(dao, new SearchAllCustomers.ListCustomersFoundListener() {
            @Override
            public void ListFound(List<Customers> customers) {

                configRecyclerAdapter(customers);

            }
        }).execute();
    }

    private void configFabAddCustomer() {
        FloatingActionButton addCutomer = findViewById(R.id.fab_add_cutomers);
        addCutomer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent goToForm = new Intent(CustomerListActivity.this, CustomerForm.class);
                startActivity(goToForm);
            }
        });
    }

}


https://github.com/renanparis/Lista_Pedidos.git

Vi o seu código e percebi alguns detalhes.

Para atualizar a lista após adicionar, você precisa realizar a atualização no onResume(), pois ao voltar para a tela de lista é ele que é chamado, se fizer no onCreate() a atualização não acontece.

Também, não recrie novamente o RecyclerView atualize apenas o dataset do adapter, pois se não perde todo o benefício do RecyclerView que visa a reutilização de views que já foram criadas, como também, realiza operações desnecessárias.

[]s

Opa Alex blz? Eu cheguei a criar o RecyclerView no onResume para testar a atualização da lista e esta funcionando. Não entendi a mensagem que apareceu "E/RecyclerView: No adapter attached; skipping layout"..quando a tela é atualizada.

  • Eu pensei em abrir outro mas como é sequencia dessa conversa decidi deixar aqui...se tiver problema abro outro tópico.

** Comecei a implementar a atualização da lista do adapter quando um cliente é inserido. Estava seguindo a orientação do curso de RecyclerView de esperar um resultado da activity do formulário de cadastro. Mas quando é clicado para salvar o cliente a tela fecha. E aparece a seguinte mensagem: 2019-06-11 15:58:16.817 8425-8425/com.paris.hayorders E/SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length. O cliente é salvo no banco de dados e aparece na lista se abrir o aplicativo novamente. Procurei alguma solução na internet mas não achei nada que resolvesse. Pode dar uma olhada no projeto? Segue o link da ultima atualização: https://github.com/renanparis/Lista_Pedidos.git

solução!

Consegui achar o problema que estava encerrando minha aplicação. Continuei chamando o método finish() quando terminava de salvar o cliente, mas agora na acitivity principal e não a da formulário. Só não consegui ainda resolver essa mensagem: E/SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length. Vlw!

Oi Renan, que bom que conseguiu resolver :)

Esse outro problema precisa identificar quando ele aparece para entender o motivo, apenas dessa maneira é difícil indicar qual é a real razão.

[]s