2
respostas

[Dúvida] App não apresenta os produtos do DAO no RecycleView

Ao clicar no botão de SALVAR do FormularioProdutoActivity os dados estão sendo salvos corretamente e até consigo ver no LOG. Mas quando volta para a tela inicial (MainActivity) não mostra os dados salvos. Já fiz as modificações necessárias da AULA 7 (Salvando Produtos), ATIVIDADE 08 (Conhecendo o ciclo de vida da Activity) mas não aparecem.

*coloquei todo o código agora

MainActivity:

package com.example.mainactivity.ui.activity


class MainActivity : AppCompatActivity(R.layout.activity_main) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onResume() {
        super.onResume()
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        val dao = ProdutosDao()
        Log.i("MainActivity1", "onCreate: ${dao.buscaTodos()}")
        recyclerView.adapter = ListaProdutosAdapter(context = this, produtos = dao.buscaTodos())
        val fab = findViewById<FloatingActionButton>(R.id.floatingActionButton)
        fab.setOnClickListener {
            val intent = Intent(this, FormularioProdutoActivity::class.java)
            startActivity(intent)
        }
    }

}

FormularioProdutoActivity:

package com.example.mainactivity.ui.activity


class FormularioProdutoActivity : AppCompatActivity(R.layout.activity_formulario_produto) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val botaoSalvar = findViewById<Button>(R.id.botao_salvar)

        botaoSalvar.setOnClickListener {
            val campoNome = findViewById<EditText>(R.id.nome)
            val nome = campoNome.text.toString()
            val campoDescricao = findViewById<EditText>(R.id.descricao)
            val descricao = campoDescricao.text.toString()
            val campoValor = findViewById<EditText>(R.id.valor)
            val valorEmTexto = campoValor.text.toString()
            val valor = if(valorEmTexto.isBlank()) {
                BigDecimal.ZERO
            } else {
                BigDecimal(valorEmTexto)
            }

            val produtoNovo = Produto(
                nome = nome,
                descricao = descricao,
                valor = valor
            )

            Log.i("FormularioProduto1", "onCreate: $produtoNovo")
            val dao = ProdutosDao()
            dao.adiciona(produtoNovo)
            Log.i("FormularioProduto1", "onCreate: ${dao.buscaTodos()}")
            finish()

        }
    }
}

ListaProdutosAdapter:

package com.example.mainactivity.ui.recyclerview.adapter

class ListaProdutosAdapter(
    private val context: Context,
    private var produtos: List<Produto>
) : RecyclerView.Adapter<ListaProdutosAdapter.ViewHolder>() {

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        fun vincula(produto: Produto) {
            val nome = itemView.findViewById<TextView>(R.id.nome)
            nome.text = produto.nome
            val descricao = itemView.findViewById<TextView>(R.id.descricao)
            descricao.text = produto.descricao
            val valor = itemView.findViewById<TextView>(R.id.valor)
            valor.text = produto.valor.toPlainString()

        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(context)
        val view = inflater.inflate(R.layout.produto_item, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val produto = produtos[position]
        holder.vincula(produto)
    }

    override fun getItemCount(): Int = produtos.size


}

Produto:

package com.example.mainactivity.model

import java.math.BigDecimal

data class Produto(
    val nome: String,
    val descricao: String,
    val valor: BigDecimal
)

ProdutosDao:

package com.example.mainactivity.dao

import com.example.mainactivity.model.Produto

class ProdutosDao {

    fun adiciona(produto: Produto){
        produtos.add(produto)
    }

    fun buscaTodos() : List<Produto> {
        return produtos.toList()
    }

    companion object {
        private val produtos = mutableListOf<Produto>()
    }

}

Print do LOG! Tela do dispositivo após criar um novo produto

2 respostas

O ideal seria você mandar o código completo. Mas vou tentar te ajudar.

Se os dados estão sendo alterados, é necessário notificar o adaptador para atualizar a RecyclerView. Veja como você pode fazer isso:

package com.example.mainactivity.ui.activity

import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.example.mainactivity.R
import com.example.mainactivity.dao.ProdutosDao
import com.example.mainactivity.ui.recyclerview.adapter.ListaProdutosAdapter
import com.google.android.material.floatingactionbutton.FloatingActionButton

class MainActivity : AppCompatActivity(R.layout.activity_main) {

    private lateinit var adapter: ListaProdutosAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        val dao = ProdutosDao()
        adapter = ListaProdutosAdapter(context = this, produtos = dao.buscaTodos())
        recyclerView.adapter = adapter
        
        val fab = findViewById<FloatingActionButton>(R.id.floatingActionButton)
        fab.setOnClickListener {
            val intent = Intent(this, FormularioProdutoActivity::class.java)
            startActivity(intent)
        }
    }

    override fun onResume() {
        super.onResume()
        val dao = ProdutosDao()
        Log.i("MainActivity1", "onResume: ${dao.buscaTodos()}")
        adapter.atualiza(dao.buscaTodos())
    }
}

E no adaptador, adicione um método para atualizar a lista de produtos:

package com.example.mainactivity.ui.recyclerview.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.mainactivity.R
import com.example.mainactivity.model.Produto

class ListaProdutosAdapter(
    private val context: Context,
    private var produtos: List<Produto>
) : RecyclerView.Adapter<ListaProdutosAdapter.ViewHolder>() {

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        // Implemente a ViewHolder aqui
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.item_produto, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // Vincule os dados do produto ao ViewHolder aqui
    }

    override fun getItemCount(): Int {
        return produtos.size
    }

    fun atualiza(novosProdutos: List<Produto>) {
        this.produtos = novosProdutos
        notifyDataSetChanged()
    }
}

eu vou mandar o meu código todo aqui para você, ele esta todo comentado e você pode avaliar o que você pode fazer para modificar o seu código, seria melhor voce mandar o código todo da próxima vez para que de para ver o código como um todo.

class MainActivity : AppCompatActivity() {

// Inicializa o binding para inflar o layout da Activity
private val binding by lazy {
    ActivityMainBinding.inflate(layoutInflater)
}
// Adapter global para a RecyclerView
private val dao = ProdutosDAO()
private val adapter by lazy {
    ListaProdutos(this,dao.buscarTodos())
}
// Método chamado na criação da Activity
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(binding.root)
    chamadaListagem()
}
// Método chamado quando a Activity é resumida
override fun onResume() {
    super.onResume()
    adapter.atualiza(dao.buscarTodos())
    salveListagem()
}
// Configura o clique do FloatingActionButton para abrir a SegundaTela
private fun salveListagem() {
    binding.fab.setOnClickListener {
        val intent = Intent(this, SegundaTela::class.java)
        startActivity(intent)
    }
}
// Configura a RecyclerView com o adapter e o layout manager
private fun chamadaListagem() {
    val dao = ProdutosDAO()
    binding.recyclerView.adapter = adapter
    binding.recyclerView.layoutManager = LinearLayoutManager(this)
}

}

Tela Do Formulario Do Item class SegundaTela : AppCompatActivity() {

// Inicializa o binding para inflar o layout da Activity
private val binding by lazy {
    ActivitySegundaTelaBinding.inflate(layoutInflater)
}

// Método chamado na criação da Activity
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(binding.root)

    // Configura o clique do botão salvar
    binding.btnSalvar.setOnClickListener {
        salvarItens()
    }
}
// Método para salvar os dados do produto
private fun salvarItens() {
    val nome = binding.editNome.text.toString()
    val tipo = binding.editTipo.text.toString()
    val valor = binding.editValor.text.toString()

    // Cria um novo produto
    val novoProduto = Produto(
        nome = nome,
        tipo = tipo,
        valor = valor
    )
    // Salva o produto no DAO (simulação de banco de dados)
    ProdutosDAO().adicionar(novoProduto)
    // Finaliza a Activity e retorna para a MainActivity
    finish()
}

} Meu Adapter // Adapter para gerenciar a lista de produtos em um RecyclerView class ListaProdutos( private val context: Context, produtos: List ) : RecyclerView.Adapter<ListaProdutos.ViewHolder>() {

// Lista mutável de produtos, permitindo atualizações
private val produtos = produtos.toMutableList()

// ViewHolder para vincular a view com os dados do produto
inner class ViewHolder(private val binding: ProdutoItemBinding) :
    RecyclerView.ViewHolder(binding.root) {

    // Método para vincular os dados do produto às views do layout
    fun vincula(produto: Produto) {
        binding.txtNome.text = produto.nome
        binding.txtTipo.text = produto.tipo
        binding.txtValor.text = produto.valor
    }
}

// Método chamado para criar uma nova instância do ViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val inflater = LayoutInflater.from(context)
    val binding = ProdutoItemBinding.inflate(inflater, parent, false)
    return ViewHolder(binding)
}
// Método que retorna o número total de itens na lista
override fun getItemCount(): Int = produtos.size
// Método para vincular os dados do produto ao ViewHolder na posição especificada
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val produto = produtos[position]
    holder.vincula(produto)
}
// Método para atualizar a lista de produtos e notificar o RecyclerView
fun atualiza(produtos: List<Produto>) {
    this.produtos.clear()
    this.produtos.addAll(produtos)
    notifyDataSetChanged()
}

}

Classe DAO // Classe DAO (Data Access Object) para simular operações de banco de dados class ProdutosDAO {

// Lista que armazena os produtos simulando uma tabela de banco de dados
companion object{
    private val produtos = mutableListOf<Produto>()
}

// Método para salvar um novo produto na lista
fun adicionar(produto: Produto) {
    produtos.add(produto)
}

// Método para buscar todos os produtos da lista
fun buscarTodos(): List<Produto> {
    return produtos.toList()
}

}