Recyclerview No hay adaptador adjunto; saltando diseño

Resuelto equitharn asked hace 54 años • 38 respuestas

Recién implementado RecyclerViewen mi código, reemplazando ListView.

Todo funciona bien. Se muestran los datos.

Pero se están registrando mensajes de error:

15:25:53.476 E/RecyclerView: No adapter attached; skipping layout

15:25:53.655 E/RecyclerView: No adapter attached; skipping layout

para el siguiente código:

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

Como puedes ver, he adjuntado un adaptador para RecyclerView. Entonces, ¿por qué sigo recibiendo este error?

He leído otras preguntas relacionadas con el mismo problema pero ninguna me ayuda.

equitharn avatar Jan 01 '70 08:01 equitharn
Aceptado

¿Puede asegurarse de llamar a estas declaraciones desde el hilo "principal" fuera de una devolución de llamada asincrónica retrasada (por ejemplo, dentro del onCreate()método)? Tan pronto como llamo a las mismas declaraciones desde un método "retrasado". En mi caso ResultCallback, recibo el mismo mensaje.

En my Fragment, llamar al código siguiente desde dentro de un ResultCallbackmétodo produce el mismo mensaje. Después de mover el código al onConnected()método dentro de mi aplicación, el mensaje desapareció...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Peter avatar Jun 01 '2015 19:06 Peter

Recibí los mismos dos mensajes de error hasta que arreglé dos cosas en mi código:

(1) De forma predeterminada, cuando implementa métodos en RecyclerView.Adaptergenera:

@Override
public int getItemCount() {
    return 0;
}

Asegúrate de actualizar tu código para que diga:

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

Obviamente, si no tiene ningún elemento en sus elementos, no aparecerá ningún elemento en la pantalla.

(2) No estaba haciendo esto como se muestra en la respuesta principal: CardView layout_width="match_parent" no coincide con el ancho principal de RecyclerView

//correct
LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

//incorrect (what I had)
LayoutInflater.from(parent.getContext())
        .inflate(R.layout.card_listitem,null);

(3) EDITAR: BONIFICACIÓN: También asegúrese de configurarlo RecyclerViewasí:

<android.support.v7.widget.RecyclerView
    android:id="@+id/RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

Así no:

<view
    android:id="@+id/RecyclerView"
    class="android.support.v7.widget.RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

He visto algunos tutoriales usando este último método. Si bien funciona, creo que también genera este error.

Micro avatar Jul 01 '2015 16:07 Micro

Tengo la misma situación contigo, la visualización está bien, pero aparece un error en la ubicación. Esa es mi solución: (1) Inicializar RecyclerView y vincular el adaptador ON CREATE()

RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);

(2) llame a notifyDataStateChanged cuando obtenga los datos

adapter.notifyDataStateChanged();

En el código fuente de recyclerView, hay otro hilo para verificar el estado de los datos.

public RecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.mObserver = new RecyclerView.RecyclerViewDataObserver(null);
    this.mRecycler = new RecyclerView.Recycler();
    this.mUpdateChildViewsRunnable = new Runnable() {
        public void run() {
            if(RecyclerView.this.mFirstLayoutComplete) {
                if(RecyclerView.this.mDataSetHasChangedAfterLayout) {
                    TraceCompat.beginSection("RV FullInvalidate");
                    RecyclerView.this.dispatchLayout();
                    TraceCompat.endSection();
                } else if(RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {
                    TraceCompat.beginSection("RV PartialInvalidate");
                    RecyclerView.this.eatRequestLayout();
                    RecyclerView.this.mAdapterHelper.preProcess();
                    if(!RecyclerView.this.mLayoutRequestEaten) {
                        RecyclerView.this.rebindUpdatedViewHolders();
                    }

                    RecyclerView.this.resumeRequestLayout(true);
                    TraceCompat.endSection();
                }

            }
        }
    };

En DispatchLayout(), podemos encontrar que hay un error en él:

void dispatchLayout() {
    if(this.mAdapter == null) {
        Log.e("RecyclerView", "No adapter attached; skipping layout");
    } else if(this.mLayout == null) {
        Log.e("RecyclerView", "No layout manager attached; skipping layout");
    } else {
Keith Gong avatar Aug 06 '2015 08:08 Keith Gong