3
respostas

Implementação recycler View com kotlin

Professor, estou fazendo este curso porém implementando-o em kotlin, pois fiz os demais de kotlin e estou testando o que aprendi nos 3 anteriores de kotlin, digo o curso sobre transações de despesas e receitas. Percebi que ao implementar o recycler view em kotlin, não foi necessário implementar o adapter como o senhor faz no método onResume(), obtive o mesmo comportamento sem a necessidade de ter que atualizar a lista vinda do DAO. Já quando tentei utilizar a mesma abordagem sua de limpar a lista e adiconar todos os itens novamente, não foi possível devido eu ter utlizado List<> ao invés de MutableList<>. Mesmo assim fiz um cast para MutableList para tentar utlizar o clear() e o addAll(). Ainda assim o comportamente foi diferente do seu, sempre era criado mais viewHolders quando eu inseria mais notas ou saia do app e voltava, parece que ele fica sempre criando ViewHolders desnecessários. O senhor teria alguma dica de implementação e comportamento no kotlin para essa abordagem? Segue minha classe ListaNotasActivity:

class ListaNotasActivity : AppCompatActivity() {

    private val dao = NotaDAO()
    private lateinit var todasNotas: List<Nota>
    private lateinit var adapter: ListaNotasAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lista_notas)
        todasNotas = notasDeExemplo()
        configuraRecyclerView(todasNotas)

        lista_notas_insere_nota.setOnClickListener {
            val iniciaFormularioNota = Intent(this, FormularioNotaActivity::class.java)
            startActivity(iniciaFormularioNota)
        }
    }

    private fun notasDeExemplo(): List<Nota> {
        dao.insere(Nota("Primeira notas", "Descrição pequena"), Nota("Segunda nota", "Segunda descrição é bem maior que a da primeira nota"))
        return dao.notas
    }

    private fun configuraRecyclerView(notas: List<Nota>) {
        configuraAdapter(notas)
    }

    private fun configuraAdapter(notas: List<Nota>) {
        adapter = ListaNotasAdapter(this, notas)
        lista_notas_recyclerview.adapter = adapter
    }
}
3 respostas

Fala Clecio, tudo bem ?

Cara, como você está criando um adapter toda vez que chama o método configuraAdapter, ele cria novas instancias do viewHolder todo momento.

Tenta usar a mesma instancia que deve funcionar igual ao do instrutor

Você não entendeu o que eu disse, eu falei que da maneira que está aí acima como colei o código, não é igual há que o professor faz no curso, pois aí em Kotlin não é necessário ta atualizando o adapter a todo momento pelo método onResume(). Eu disse que obtive o mesmo resultado dele da maneira que meu código está aí acima exemplificado, só isso, meu questionamento era se em kotlin é realmente dessa maneira, ou se isso pode ter sido apenas uma coincidência.

Foi coincidência, Clecio. Usar Java ou Kotlin não muda a forma como os componentes do Android funcionam, então um RecyclerView, um Adapter, um ViewHolder, o ciclo de vida da Activity funcionam da mesma forma em Java ou em Kotlin.

O que acontece é que sua implementação em Kotlin fica ligeiramente diferente da versão em Java (em Kotlin, você usou uma lista imutável e em Java, mutável). Isso causa esse bug na versão Kotlin, que mesmo usando um casting, não é resolvido.

O casting só resolve o conflito de tipos, mas não é capaz (nessa situação) de converter uma lista imutável em uma mutável. Para isso, o seu código deve retornar a lista mutável, sem o uso de cast.