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

[Java] Erro: No adapter attached; skipping layout

Eu estava desenvolvendo um projeto com base no curso utilizando Fragments e RecyclerView em Java, mas após ainda dá o mesmo erro, alguém saberia oq está errado? Segue o código.

  • ListaFragment
public class ListaFragment extends Fragment {
    public ListaFragment(){}

    private  RecyclerView lista;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View viewLista = inflater.inflate(R.layout.lista_fragment, container, false);
        setFragmentLayoutManager(viewLista);
        return viewLista;
    }

    private void setFragmentLayoutManager(View viewLista) {
        final FragmentActivity activity = getActivity();
        lista = viewLista.findViewById(R.id.lista_pedidos_recyclerview);
        lista.setLayoutManager(new LinearLayoutManager(activity));
    }
}

* ListaAdapter
public class ListaAdapter extends RecyclerView.Adapter {
    private List<Pedido> pedidos = new ArrayList<>();
    private Context context;

    public ListaAdapter(Context context){ this.context = context; }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        getInflateView(parent);
        ListaProdutosViewHolder holder = new ListaProdutosViewHolder(parent);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        ListaProdutosViewHolder meuHolder = (ListaProdutosViewHolder) holder;
        Pedido p1 = pedidos.get(position);
        bindElementos((ListaProdutosViewHolder) holder, p1);
    }

    private void bindElementos(ListaProdutosViewHolder holder, Pedido p1) {
        holder.nome.setText(p1.getNomeCliente());
        holder.descricao.setText(p1.getDescricaoPedido());
        holder.dataHorario.setText(p1.getDataAgendada() + " - " + p1.getHorarioAgendado());
    }

    @Override
    public long getItemId(int i) { return pedidos.get(i).getPedidoId(); }

    @Override
    public int getItemCount() {
        return pedidos.size();
    }

    private View getInflateView(ViewGroup viewGroup) {
        return LayoutInflater
                .from(this.context)
                .inflate(R.layout.item_lista_pedidos, viewGroup, false);
    }

    public void remove(Pedido pedido){
        //melhorar depois
        if(pedidos.contains(pedido)){
           int posicaoParaRemocao = pedidos.indexOf(pedido);
           pedidos.remove(posicaoParaRemocao);
        }
        notifyDataSetChanged();
    }

    public void insere(Pedido pedido){
        pedidos.add(pedido);
    }

    public void atualizaLista(List<Pedido> meusPedidos){
        this.pedidos.clear();
        this.pedidos.addAll(meusPedidos);
    }
}

*     ListaViewHolder
    public class ListaProdutosViewHolder extends RecyclerView.ViewHolder {
    final TextView nome, descricao, dataHorario;

    public ListaProdutosViewHolder(@NonNull View itemView) {
        super(itemView);
        this.nome = itemView.findViewById(R.id.item_nome_cliente);
        this.descricao = itemView.findViewById(R.id.item_descricao_pedido);
        this.dataHorario = itemView.findViewById(R.id.item_data_hora);
    }
}


*     activityMainLista
    public class ListaMainActivity extends AppCompatActivity {

    ListaProdutosView view = new ListaProdutosView(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_lista);

        if(savedInstanceState == null){
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragment_main, new ListaFragment(), "lista_pedidos")
                    .commit();
        }

    }
}
7 respostas

Oi Beatriz, tudo bem ?

Pelo que vi aqui, você esqueceu de usar o adapter, você criou o arquivo mas não chegou a usa-lo na definição da sua lista.

Realizei as seguintes mudanças no código, agora ele está executando:

Adapter:

@NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View minhaView = inflater.inflate(R.layout.item_lista_pedidos, parent, false);
        return new ListaProdutosViewHolder(minhaView);
    }

Main:


recyclerView = findViewById(R.id.lista_pedidos_recyclerview);

        List<Pedido> todosPedidos = new ArrayList<>();
        for(int i=0; i<10;i++){
            view.dao.insere(new Pedido("Cliente " + (i+1), "descricao " + (i+1), "31/03", "16:15"));
        }
        todosPedidos = view.dao.todos();

        recyclerView.setAdapter(new ListaAdapter(this, todosPedidos));
        if(savedInstanceState == null){
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragment_main, new ListaFragment(), "lista_pedidos")
                    .commit();
        }

    }

Mas no teste de exibir vários itens está falhando, e exibindo apenas o primeiro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Consegue mostrar o xml da sua activity ?

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    >

    <TextView
        android:layout_width="0dp"
        android:layout_height="2dp"
        android:layout_marginTop="32dp"
        android:background="@drawable/division_item_lista"
        android:textColor="#ffffff"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/item_data_hora" />

    <TextView
        android:id="@+id/item_nome_cliente"
        android:layout_width="260dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:textColor="@color/black"
        android:textSize="32sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/item_editar"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.083"/>

    <TextView
        android:id="@+id/item_descricao_pedido"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="12dp"
        android:textColor="@color/cardview_dark_background"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/item_nome_cliente"
        app:layout_constraintTop_toBottomOf="@+id/item_nome_cliente"/>

    <TextView
        android:id="@+id/item_data_hora"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="4dp"
        android:textColor="@color/purple_700"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="@+id/item_descricao_pedido"
        app:layout_constraintTop_toBottomOf="@+id/item_descricao_pedido"/>

    <Button
        android:id="@+id/item_btn_concluido"
        android:layout_width="30dp"
        android:layout_height="40dp"
        android:layout_marginStart="4dp"
        android:layout_marginTop="4dp"
        android:backgroundTint="@color/teal_700"
        android:foreground="@drawable/ic_done"
        android:foregroundTint="@color/white"
        app:layout_constraintStart_toStartOf="@+id/item_nome_cliente"
        app:layout_constraintTop_toBottomOf="@+id/item_descricao_pedido" />

    <Button
        android:id="@+id/item_btn_cancelado"
        android:layout_width="30dp"
        android:layout_height="40dp"
        android:layout_marginStart="20dp"
        android:backgroundTint="@color/purple_200"
        android:foreground="@drawable/ic_close"
        android:foregroundTint="@color/white"
        app:layout_constraintStart_toEndOf="@+id/item_btn_concluido"
        app:layout_constraintTop_toTopOf="@+id/item_btn_concluido" />
    <Button
        android:id="@+id/item_editar"
        android:layout_width="90dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:backgroundTint="@color/white"
        android:text="editar"
        android:textColor="@color/purple_200"
        android:textSize="14sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/button"
        app:layout_constraintTop_toTopOf="@+id/item_nome_cliente" />
    <Button
        android:id="@+id/button"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginTop="12dp"
        android:layout_marginEnd="8dp"
        android:backgroundTint="@color/white"
        android:foreground="@drawable/ic_delete"
        android:foregroundTint="#ff006e"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@+id/item_editar"></Button>
    <TextView
        android:id="@+id/textView_status_pedido"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/purple_700"
        android:textSize="18sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/item_data_hora"
        app:layout_constraintHorizontal_bias="0.009"
        app:layout_constraintStart_toStartOf="@+id/item_descricao_pedido"
        app:layout_constraintTop_toTopOf="@+id/item_data_hora"
        android:visibility="gone"/>
</androidx.constraintlayout.widget.ConstraintLayout>

lista_fragment.xml

<?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=".ListaMainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/lista_pedidos_recyclerview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layoutManager="LinearLayoutManager"

        tools:listitem="@layout/item_lista_pedidos"
        />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/botao_adicionar_pedidos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        app:layout_constraintBottom_toBottomOf="@+id/lista_pedidos_recyclerview"
        app:layout_constraintEnd_toEndOf="@+id/lista_pedidos_recyclerview"
        app:layout_constraintHorizontal_bias="0.954"
        app:layout_constraintStart_toStartOf="@+id/lista_pedidos_recyclerview"
        app:layout_constraintTop_toTopOf="@+id/lista_pedidos_recyclerview"
        app:layout_constraintVertical_bias="0.976"
        app:srcCompat="@drawable/ic_add" />
</androidx.constraintlayout.widget.ConstraintLayout>

activity_main_lista.xml

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

    <fragment
        android:id="@+id/fragment_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.example.pedidos.ListaFragment"
        ></fragment>

</androidx.constraintlayout.widget.ConstraintLayout>
solução!

Olhei aqui e vi que acho que voce colocou código do fragment na activity, por isso não tá funcionando, o bloco que adiciona os valores deveria estar no fragment, certo ?

recyclerView = findViewById(R.id.lista_pedidos_recyclerview);

        List<Pedido> todosPedidos = new ArrayList<>();
        for(int i=0; i<10;i++){
            view.dao.insere(new Pedido("Cliente " + (i+1), "descricao " + (i+1), "31/03", "16:15"));
        }
        todosPedidos = view.dao.todos();

        recyclerView.setAdapter(new ListaAdapter(this, todosPedidos));

Funcionou! A lista estática e o adapter estavam na classe errada. Obrigada!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software