Recyclerview No hay adaptador adjunto; saltando diseño
Recién implementado RecyclerView
en 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.
¿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 ResultCallback
mé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 );
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.Adapter
genera:
@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 RecyclerView
así:
<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.
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 {