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

Implementação de clickItem no recycleview

Pessoal, dês do inicio do curso estou utilizando o recycleview ao invés do listview. Até agora tudo bem, mas cheguei na parte de eventos de click, vi que no recycleview é um pouco diferente. Eu já implementei o recycleview em Java, mas no Kotlin parece que tem umas peculiaridades, encontrei vários jeitos na internet, mas nenhum me convence de ser um método mais adequado.

Alguém pode me ajudar nessa parte? Segue com documentação ou exemplos? Se alguém também utilizou recycleview me da um help.

6 respostas

Oi Daniel, tudo bem ?

Cara acho que não existe um jeito padrão de fazer, você vai ver diversas implementações, uma que gosto bastante é pensar no pattern delegate, que no kotlin a gente pode utilizar o conceito de high order function para implementar.

Opa Matheus, tudo bem? Massa, estou aprendendo sobre o conceito de high order function. Tem algum exemplo que possa me mostrar?

Seria algo assim:

class Adapter(val lista : List<Objeto> ,val funcao : (Objeto) -> Unit) : RecyclerView.Adapter<SeuViewHolder> {

    // metodos do adapter


    override fun onBind(holder : SeuViewHolder, posicao : Int) {
        // recupera o item dessa posicao  
        // val obj 
        holder.bind(obj)
    }

    inner class SeuViewHolder(view :View) : ViewHolder(view) {

        fun bind(obj: Objeto) {
            itemView.setOnClickListener {
                funcao(obj)
            }
            //resto do bind
        }
    }
}

Ai na hora que tu for definir o adapter tu faria algo assim :

// qualquer lugar que vá criar o adapter

val adapter = Adapter(objetos) {objeto -> seu click}

humm Interessante Mateus Eu achei massa essa questão de você chamar uma função dentro de outra função Achei um exemplo tipo esse hoje no stackoverflow comprei o livro de Kotlin tambem, vou ver se tem algumas coisas para entender mais esse conceito.

Vou tentar implementar isso que me mandou, parece de boa, só achei estranho no adapter passar como parametro esse click rsrsr Falando nisso, tenho que passar como parametro mesmo no adapter, ou posso colocar isso como uma property digamos assim, da classe mesmo?

solução!

Passando como parametro sua classe adapter não sabe qual é o comportamento, ela apenas depende disso, que em geral é o recomendado, pois a responsabilidade de um adapter é basicamente adapter uma lista de objetos para uma lista de views, agora o comportamento de click, que geralmente vai manipular a tela, não deveria estar dentro do adapter, por esse motivo implementamos o high order function seguindo a convenção de delegate.

Chique Obrigado meu caro

Olha só como que ficou para quem precisar:

private fun configureRecyclerView() {
    val linearLayoutManager = LinearLayoutManager(this)
    with(recycle) {
        layoutManager = linearLayoutManager
        setHasFixedSize(true)
        addItemDecoration(DividerItemDecoration(this@MainActivity, linearLayoutManager.orientation))
        adapter = ProdutoAdapterRecycle2(produtos, this@MainActivity) { _, position ->
            val produtoAlteraro = produtos[position]
            chamaDialogAlteracao(produtoAlteraro, position)
        }
        setOnCreateContextMenuListener { menu, _, _ ->
            menu.add(Menu.NONE, 1, Menu.NONE, "Remover")
        }
    }
}

ProdutoAdapterRecycle2 é por que eu fiz varias para testar uma melhor solução.

Abraços