1
resposta

consegui implementar o popup mas fiquei com dúvida na parte final

Na verdade fiqueri com muita dúvida em toda a implementação mas sobre a parte final eu não entendi otoda a parte de "quandoClicaEmEditar(produto)" e "quandoClicaEmRemover(produto)"

o meu codigo funciona sem essa parte porém quando adiciono esses dois métodos ele quebra na parte do produto. A parte que está comentada dentro de onMenuItemClick.

Eles funcionam somente quando eu crio uma função pra cada um deles que também comentei.

package br.com.alura.orgs.adapter

import...

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

    private val produtos = produtos.toMutableList()

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

        fun vincula(produto: Produto) {
            val nome = binding.nome
            nome.text = produto.nome
            val descricao = binding.descricao
            descricao.text = produto.descicao
            val valor = binding.preco
            valor.text = NumberFormat.getCurrencyInstance(Locale("pt", "br")).format(produto.valor)
            binding.imageViewItem.carregarImagem(produto.imagem)
            binding.cardView.setOnClickListener {
                val intent = Intent(context, DetalhesProdutoActivity::class.java).apply {
                    putExtra("produto", produto)
                }
                ContextCompat.startActivity(context, intent, null)
            }
            binding.cardView.setOnLongClickListener {
                PopupMenu(context, itemView).apply {
                    menuInflater.inflate(
                        R.menu.detalhes_produto_menu, menu
                    )
                    setOnMenuItemClickListener(this@ViewHolder)
                }.show()
                true
            }
        }

        override fun onMenuItemClick(item: MenuItem?): Boolean {
            item?.let {
                when (it.itemId) {
                    R.id.detalheProdutoMenu_editar -> {
                        //quandoClicaEmEditar(produto)
                    }
                    R.id.detalheProdutoMenu_excluir -> {
                        //quandoClicaEmRemover(produto)
                    }
                }
            }
            return true
        }

    }

//    private fun quandoClicaEmEditar(produtos: MutableList<Produto>) {
//        Log.e("testeMenu", "click editar")
//    }
//
//    private fun quandoClicaEmRemover(produtos: MutableList<Produto>) {
//        Log.e("testeMenu", "click excluirr")
//    }

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



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

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

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

}

Não ententendi porque tenho fazer essa parte na main tambem.

package br.com.alura.orgs.ui


import...

class ListaProdutosActivity: AppCompatActivity(){

    private var adapter = ListaProdutosAdapter(this,)
    private lateinit var binding: ActivityListaProdutosBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityListaProdutosBinding.inflate(layoutInflater)
        setContentView(binding.root)

        creatList()
        fab_lick()
    }

    override fun onResume() {
        super.onResume()
        val db = AppDatabase.instacia(this)
        val produtoDao = db.produtoDao()
        adapter.atualiza(produtoDao.buscarTodos())
        creatList()

    }

    private fun creatList() {
        binding.rv1.adapter = this.adapter
        binding.rv1.layoutManager = LinearLayoutManager(this)
    }

    private fun fab_lick(){
        binding.fabAdd
            .setOnClickListener{
                val intent = Intent(this, FormularioProdutoActivity::class.java)
                startActivity(intent)
            }
        adapter.quandoClicaEmEditar = {
            Log.i("teste", "configuraRecyclerView: Editar $it")
        }
        adapter.quandoClicaEmRemover = {
            Log.i("teste", "configuraRecyclerView: Remover $it")
        }
    }



}
1 resposta

Olá, Murilo! Entendo que você esteja com dúvidas sobre a implementação dos métodos quandoClicaEmEditar(produto) e quandoClicaEmRemover(produto).

A ideia desses métodos é fornecer uma maneira de lidar com os cliques nos itens do menu popup na sua Activity. Esses métodos são declarados no seu Adapter e recebem como parâmetro um objeto do tipo Produto.

No código que você compartilhou, esses métodos estão sendo definidos como vazios por padrão (var quandoClicaEmEditar: (produto: Produto) -> Unit = {} e var quandoClicaEmRemover: (produto: Produto) -> Unit = {}). Isso significa que, se você não fornecer uma implementação para eles, nada acontecerá quando os itens do menu popup forem clicados.

Agora, no seu Activity, você está fornecendo a implementação desses métodos (adapter.quandoClicaEmEditar = {...} e adapter.quandoClicaEmRemover = {...}). Essa implementação é uma função lambda que recebe um Produto como parâmetro e, no seu caso, apenas registra um log.

No seu ViewHolder, quando um item do menu é clicado, você deve chamar esses métodos e passar o produto associado. Por exemplo, no caso do item de menu "editar", você deve descomentar a linha quandoClicaEmEditar(produto). Isso chamará a função que você definiu no seu Activity.

Se o seu código está quebrando quando você adiciona esses métodos, o problema pode estar na variável produto que você está tentando passar. Você precisa garantir que essa variável esteja acessível dentro do método onMenuItemClick(). Uma maneira de fazer isso é declarar produto como uma variável de instância do ViewHolder.

Espero ter ajudado e bons estudos!