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

Incrementando o desafio de Popup

No módulo 4 fomos desafiados a criar popups quando pressionamos os itens do recycle. Eu fiz tudo direitinho e agora com o fim do curso eu decidi incrementar as funcionalidades nos Popups, mas estou com uma dificuldade de notificar ao adapter que o produto foi removido. Segue meu código:

class ListaProdutosActivity : AppCompatActivity(R.layout.activity_lista_produtos) {

    private val adapter = ListaProdutosAdapter(this)
    private val binding by lazy {
        ActivityListaProdutosBinding.inflate(layoutInflater)
    }
    private val produtosDao by lazy {
        AppDatabase.instance(this).produtosDao()
    }



    private fun configuraFab() {
        val fab = binding.extendedFab
        fab.setOnClickListener {
            Intent(this@ListaProdutosActivity, FormularioProdutoActivity::class.java)
                .apply {
                    startActivity(this)
                }
        }
    }

    private fun configuraRecyclerView() {
        val recyclerView = binding.recyclerView
        recyclerView.adapter = adapter
        adapter.onClickItem = {
            Intent(this@ListaProdutosActivity, DetalhesProdutoActivity::class.java)
                .apply {
                    putExtra(CHAVE_PRODUTO_ID, it.id)
                    startActivity(this)
                }
        }
        adapter.quandoClicaEmRemover = {
            produtosDao.remover(it)
            adapter.notifyDataSetChanged()
        }
        adapter.quandoClicaEmEditar = {
            Intent(this@ListaProdutosActivity, FormularioProdutoActivity::class.java)
                .apply {
                    putExtra(CHAVE_PRODUTO_ID,it.id)
                    startActivity(this)
                }
        }
    }
}

Main Activity

class ListaProdutosAdapter(
    private val context: Context,
    produtos: List<Produtos> = emptyList(),
    var onClickItem: (produtos: Produtos) -> Unit = {},
    var quandoClicaEmRemover: (produtos: Produtos) -> Unit = {},
    var quandoClicaEmEditar: (produtos: Produtos) -> Unit = {}
) : RecyclerView.Adapter<ListaProdutosAdapter.ViewHolder>() {

    private val produtos = produtos.toMutableList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ProdutoItemBinding
            .inflate(
                LayoutInflater
                    .from(parent.context),
                parent,
                false
            )
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(produtos[position])
    }

    override fun getItemCount(): Int = produtos.size

    fun atualiza(produtos: List<Produtos>) {
        this.produtos.clear()
        this.produtos.addAll(produtos)
        notifyDataSetChanged()
    }

    inner class ViewHolder(private val binding: ProdutoItemBinding) :
        RecyclerView.ViewHolder(binding.root), PopupMenu.OnMenuItemClickListener {

        private lateinit var produto: Produtos

        init {
            itemView.setOnLongClickListener {
                if (::produto.isInitialized) {
                    showPopup(it)
                }
                true
            }
            itemView.setOnClickListener {
                if (::produto.isInitialized) {
                    onClickItem(produto)
                }
            }
        }

        override fun onMenuItemClick(item: MenuItem?): Boolean {
            return when (item?.itemId) {
                R.id.menu_popup_lista_produtos_editar -> {
                    quandoClicaEmEditar(produto)
                    true
                }
                R.id.menu_popup_lista_produtos_remover -> {
                    quandoClicaEmRemover(produto)
                    true
                }
                else -> false
            }
        }

        fun showPopup(v: View) {
            PopupMenu(context, v).apply {
                inflate(R.menu.menu_popup_lista_produtos)
                setOnMenuItemClickListener(this@ViewHolder)
                show()
            }
        }

        private val produtoTitulo = binding.titulo
        private val produtoDescricao = binding.descricao
        private val produtoValor = binding.valor
        private val produtoImagem = binding.imageView

        fun bind(produtos: Produtos) {
            this.produto = produtos
            produtoTitulo.text = produtos.nome
            produtoDescricao.text = produtos.descricao
            produtoValor.text = produtos.valor.formataParaMoedaReal()
            produtoImagem.tryLoadImage(produtos.imagemUrl)

            val visibilidade = if (produtos.imagemUrl != null) {
                View.VISIBLE
            } else {
                View.GONE
            }
            binding.imageView.visibility = visibilidade
        }
    }
}

Adapter

2 respostas

Retirei o onCreate e onResume no código acima apenas para conseguir enviar a pergunta

solução!

Solucionei trocando o notifyDataSetChanged do adapter parar a função de atualização de tela

 private fun configuraRecyclerView() {
        val recyclerView = binding.recyclerView
        recyclerView.adapter = adapter
        adapter.onClickItem = {
            Intent(this@ListaProdutosActivity, DetalhesProdutoActivity::class.java)
                .apply {
                    putExtra(CHAVE_PRODUTO_ID, it.id)
                    startActivity(this)
                }
        }
        adapter.quandoClicaEmRemover = {
            produtosDao.remover(it)
            adapter.notifyDataSetChanged()
        }