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

Minha activity só mostra 1 das recycler view

Bom dia a todos

Eu tava fazendo o desafio final do Migration e Relacionamento com o Room, e estava na parte do menu de listagem dos produtos por usuário, mas o meu problema é que não há a junção de ambos e só mostra o primeiro usuário da lista no cabeçalho. Ele fica desse jeito:

não mostra as 2 recycler views, só mostra o cabeçalho

Eu queria saber o que estou errando, porque eu até deixei o código igual ao que está no código do desafio (com exceção de um ajuste pelo fato de ter mais de 1 HOF no ListaProdutosAdapter

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/cabecalho_usuario_titulo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintVertical_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="@tools:sample/full_names" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.activity.ListarTodosActivity">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/activity_lista_todos_produtos_recycler_view"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:listitem="@layout/produto_item" />

</androidx.constraintlayout.widget.ConstraintLayout>
class ListarTodosAdapter(
    private val context: Context,
    usuario: List<String?> = emptyList()
    ):RecyclerView.Adapter<ListarTodosAdapter.ViewHolderMapper>() {

    private val usuarios: List<String?> = usuario.toMutableList()

    inner class ViewHolderMapper(
        private val binding: CabecalhoUsuarioBinding
    ):RecyclerView.ViewHolder(binding.root){
        fun vincula(usuario: String?){
            binding.cabecalhoUsuarioTitulo.text = usuario
        }
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int,
    ) = ViewHolderMapper(
            CabecalhoUsuarioBinding.inflate(LayoutInflater.from(context),
                parent,
                false)
        )


    override fun getItemCount(): Int = usuarios.size

    override fun onBindViewHolder(holder: ViewHolderMapper, position: Int) {
        val usuario = if (usuarios[position].isNullOrBlank())
            "sem usuario"
         else usuarios[position]
        holder.vincula(usuario)
    }
}

Vou deixar o código da activity em um outro comentário (faltou espaço)

Ps: não fiz a parte ainda do formulário, vou fazer agora esperando a resposta desse fórum

Ps2: infelizmente não achei nada no logcat que me auxilie a descobrir o erro

2 respostas

Código da activity

class ListarTodosActivity: UsuarioBaseActivity() {
    private val binding by lazy{
        ActivityListaTodosProdutosBinding.inflate(layoutInflater)
    }
    private val dao by lazy {
        AppDatabase.instanciaBanco(this).produtoDao()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        val recyclerView = binding.activityListaTodosProdutosRecyclerView
        lifecycleScope.launch {
            dao.buscaTodos().map {produtos->
                produtos.sortedBy {produto ->
                    produto.usuarioId
                }.groupBy {produto ->
                        produto.usuarioId
                    }.map {produtoUsuario ->
                        criaAdapterDeProdutoComCabecalho(produtoUsuario)
                }.flatten()
            }.collect{ adapter ->
                recyclerView.adapter = ConcatAdapter(adapter)
            }
        }
    }

    private fun criaAdapterDeProdutoComCabecalho(produtoUsuario: Map.Entry<String?, List<Trap>>)
    : List<RecyclerView.Adapter<out RecyclerView.ViewHolder>> {
        val adapterUsuario = ListarTodosAdapter(this, listOf(produtoUsuario.key))
        val adapterProdutoUsuario = ListaProdutosAdapter(this, produtoUsuario.value)
        adapterProdutoUsuario.quandoClicaNoItemListener = {
            vaiPara(DescricaoProdutoActivity::class.java) {
                putExtra(CHAVE_PRODUTO_ID, it.id)
            }
        }
        return listOf(adapterUsuario,adapterProdutoUsuario)
    }
}

PS: eu fiz uma adaptação na função criaAdapterDeProdutoComCabecalho, baseada neste fórum

solução!

O professor alex me respondeu no fórum e vou deixar a solução aqui Eu deveria ter trocado no ConstraintLayout do cabecalho do usuario, o layout height deveria ser wrap_content ao invés de match_parent. Solução do código:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    //eu troquei o "match_parent" por "wrap_content" aqui
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">