android - recyclerview - vista de reciclaje No hay adaptador conectado; diseño omitido
recyclerview dependency (30)
Acabo de implementar Recyclerview en mi código, reemplazando Listview.
Todo funciona bien. Se muestran los objetos.
pero logcat dice
15: 25: 53.476 E / RecyclerView ﹕ No hay adaptador conectado; diseño omitido
15: 25: 53.655 E / RecyclerView ﹕ No hay adaptador conectado; diseño omitido
por el 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 puede ver, he adjuntado un adaptador para Recycleview . Entonces, ¿por qué sigo recibiendo este error?
He leído otras preguntas relacionadas con el mismo problema, pero ninguna ayuda.
¿Puede asegurarse de que está llamando a estas declaraciones desde el hilo "principal" (por ejemplo, dentro del método
onCreate()
).
Tan pronto como llamo a las mismas declaraciones de un método "retrasado".
En mi caso, un
ResultCallback
, recibo el mismo mensaje.
En mi
Fragment
, llamar al siguiente código desde un método
ResultCallback
produce el mismo mensaje.
Después de mover el código al método
onConnected()
dentro de mi aplicación, el mensaje desapareció ...
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
// Sucede cuando no está configurando el adaptador durante la fase de creación: llame a notifyDataSetChanged () cuando la respuesta de la API está funcionando correctamente
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
magazineAdapter = new MagazineAdapter(getContext(), null, this );
newClipRecyclerView.setAdapter(magazineAdapter);
magazineAdapter.notifyDataSetChanged();
APICall();
}
public void APICall() {
if(Response.isSuccessfull()){
mRecyclerView.setAdapter(mAdapter);
}
}
Just move setting the adapter into onCreate with an empty data and when you have the data call:
mAdapter.notifyDataSetChanged();
1) Crear ViewHolder que no hace nada :)
// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
public SampleHolder(View itemView) {
super(itemView);
}
}
2) Nuevamente cree RecyclerView que no hace nada :)
// SampleRecycler.java
public class SampleRecycler extends RecyclerView.Adapter<SampleHolder> {
@Override
public SampleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(SampleHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
3) Ahora, cuando su reciclador real no esté listo, simplemente use el ejemplo como se muestra a continuación.
RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id);
myRecycler.setLayoutManager(new LinearLayoutManager(this));
myRecycler.setAdapter(new SampleRecycler());
Sin embargo, esta no es la mejor solución, ¡pero funciona! Espero que esto sea útil.
Añadiendo otra respuesta desde que encontré este hilo buscando en Google el error.
Estaba tratando de inicializar un
PreferenceFragmentCompat
pero olvidé inflar el XML de preferencia en
onCreatePreferences
como este:
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val inflater = LayoutInflater.from(context)
inflater.inflate(R.layout.fragment_settings, null)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
// Missing this line here:
// setPreferencesFromResource(R.xml.settings, rootKey)
}
}
El error fue un misterio hasta que me di cuenta de que
PreferenceFragmentCompat
debe estar usando un
RecyclerView
internamente.
Asegúrese de configurar el administrador de diseño para su RecyclerView de la siguiente manera:
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
En lugar de
LinearLayoutManager
, también puede usar
other
administradores de diseño.
Comprueba si no has llamado a este método en tu adaptador
@Override
public int getItemCount() {
return list.size();
}
En mi caso sucedió porque incruste un RecyclerView en un LinearLayout.
Anteriormente tenía un archivo de diseño que solo contenía un RecyclerView raíz de la siguiente manera
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/fragment_products"
android:name="Products.ProductsFragment"
app:layoutManager="LinearLayoutManager"
tools:context=".Products.ProductsFragment"
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"/>
Creo que el problema está dentro de las 3 líneas separadas. De todos modos, creo que es un problema simple, trabajaré en ello mañana; Pensé que debería escribir lo que encontré antes de olvidarme de este hilo.
En mi caso, estaba configurando el adaptador dentro de la devolución de llamada Y depuración
onLocationChanged()
en el emulador.
Como no detectó un cambio de ubicación, nunca disparó.
Cuando los configuré manualmente en los controles extendidos del emulador funcionó como se esperaba.
En mi situación, era un componente olvidado que se ubica en la clase ViewHolder pero no estaba ubicado en el archivo de diseño
En su clase de adaptador
RecyclerView
, por ejemplo
MyRecyclerViewAdapter
,
MyRecyclerViewAdapter
un constructor con los siguientes parámetros.
MyRecyclerViewAdapter(Context context, List<String> data) {
this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
this.mData = data;
}
mData
son los datos que pasará al adaptador.
Es opcional si no tiene datos para pasar.
mInflater
es el objeto
LayoutInflater
que ha creado y que utiliza en la función
OnCreateViewHolder
del adaptador.
Después de esto, conecta el adaptador en MainActivity o donde desee en el hilo principal / UI correctamente como
MyRecyclerViewAdapter recyclerAdapter;
OurDataStuff mData;
....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Like this:
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerAdapter = new RecyclerAdapter(this, mData); //this, is the context. mData is the data you want to pass if you have any
recyclerView.setAdapter(recyclerAdapter);
}
....
Estas líneas deben estar en
OnCreate
:
mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
Este problema se debe a que no está agregando ningún
LayoutManager
para su
RecyclerView
.
Otra razón es porque está llamando a este código en un NonUIThread. Asegúrese de llamar a esta llamada en el UIThread.
La solución es que solo tiene que agregar un
LayoutManager
para
RecyclerView
antes de
setAdapter
en el subproceso de interfaz de usuario.
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Esto es realmente un simple error que está recibiendo, no hay necesidad de hacer ningún código en esto. Este error ocurre debido al archivo de diseño incorrecto utilizado por la actividad. Por IDE, automáticamente creé un diseño v21 de un diseño que se convirtió en un diseño predeterminado de la actividad. Todos los códigos que hice en el archivo de diseño antiguo y el nuevo solo tenían unos pocos códigos xml, lo que condujo a ese error.
Solución: copie todos los códigos del diseño anterior y péguelo en el diseño v 21
Esto sucede porque el diseño inflado real es diferente del que usted está refiriendo mientras encuentra el recyclerView.
De manera predeterminada cuando crea el fragmento, el método onCreateView aparece de la siguiente manera:
return inflater.inflate(R.layout.<related layout>,container.false);
En lugar de eso, cree la vista por separado y
View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;
para referirse a recyclerView
View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;
View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;
Funcionó para mi.
- Haga esto si está utilizando el emulador.
android: usesCleartextTraffic = "true"
- Si su diseño xml de cardview es así,
android.support.v7.widget.CardView
Reemplace el diseño de cardview xml con android x. Debe ser tal;
androidx.cardview.widget.CardView
- Si su diseño xml de recyclerview es así,
android.support.v7.widget.RecyclerView
Reemplace el diseño de cardview xml con android x. Debe ser tal;
androidx.recyclerview.widget.RecyclerView
He resuelto este error. Solo necesita agregar el administrador de diseño y agregar el adaptador vacío.
Me gusta este código:
myRecyclerView.setLayoutManager(...//your layout manager);
myRecyclerView.setAdapter(new RecyclerView.Adapter() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
});
//other code''s
// and for change you can use if(mrecyclerview.getadapter != speacialadapter){
//replice your adapter
//}
Mi problema era que mi vista de reciclador se veía así
<android.support.v7.widget.RecyclerView
android:id="@+id/chatview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
</android.support.v7.widget.RecyclerView>
Cuando debería haberse visto así
<android.support.v7.widget.RecyclerView
android:id="@+id/chatview"
android:layout_width="395dp"
android:layout_height="525dp"
android:layout_marginTop="52dp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="8dp"></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
No era una gran respuesta, pero también tenía el mismo problema incluso con el código correcto.
A veces, es solo la marca más simple.
En este caso, el error del OP también puede faltar
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
del Manifiesto, que reproduce el mismo error.
Ocurre cuando no está configurando el adaptador durante la fase de creación:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
....
}
public void onResume() {
super.onResume();
mRecyclerView.setAdapter(mAdapter);
....
}
Simplemente mueva la configuración del adaptador a onCreate con datos vacíos y cuando tenga la llamada de datos:
mAdapter.notifyDataSetChanged();
Para aquellos que usan
RecyclerView
dentro de un
fragmento
y lo inflan desde otras vistas: al inflar la vista de fragmento completo, asegúrese de vincular
RecyclerView
a su vista raíz.
Estaba conectando y haciendo todo para el adaptador correctamente, pero nunca hice el enlace. Esta answer de @Prateek Agarwal lo tiene todo para mí, pero aquí hay más detalles.
Kotlin
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater?.inflate(R.layout.fragment_layout, container, false)
recyclerView = rootView?.findViewById(R.id.recycler_view_id)
// rest of my stuff
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = viewManager
recyclerView?.adapter = viewAdapter
// return the root view
return rootView
}
Java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView= inflater.inflate(R.layout.fragment_layout,container,false);
recyclerview= rootView.findViewById(R.id.recycler_view_id);
return rootView;
}
Perdí 16 minutos de mi vida con este problema, así que solo admito este error increíblemente vergonzoso que estaba cometiendo: estoy usando Butterknife y ato la vista en onCreateView en este fragmento.
Me llevó mucho tiempo descubrir por qué no tenía un administrador de diseño, pero obviamente las vistas se inyectan para que no sean nulas, por lo que el reciclador nunca será nulo ... ¡vaya!
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@Override
public View onCreateView(......) {
View v = ...;
ButterKnife.bind(this, v);
setUpRecycler()
}
public void setUpRecycler(Data data)
if (recyclerView == null) {
/*very silly because this will never happen*/
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
//more setup
//...
}
recyclerView.setAdapter(new XAdapter(data));
}
Si tiene un problema como este, rastree su vista y use algo como
uiautomatorviewer
Primero inicialice el adaptador
public void initializeComments(){
comments = new ArrayList<>();
comments_myRecyclerView = (RecyclerView) findViewById(R.id.comments_recycler);
comments_mLayoutManager = new LinearLayoutManager(myContext);
comments_myRecyclerView.setLayoutManager(comments_mLayoutManager);
updateComments();
getCommentsData();
}
public void updateComments(){
comments_mAdapter = new CommentsAdapter(comments, myContext);
comments_myRecyclerView.setAdapter(comments_mAdapter);
}
Cuando haya un cambio en el conjunto de datos, simplemente llame al método updateComments.
Recibía los mismos dos mensajes de error hasta que solucioné dos cosas en mi código:
(1) Por defecto, cuando implementa métodos en
RecyclerView.Adapter
genera:
@Override
public int getItemCount() {
return 0;
}
Asegúrese de actualizar su código para que diga:
@Override
public int getItemCount() {
return artists.size();
}
Obviamente, si tiene cero elementos en sus elementos, obtendrá cero elementos que se muestran en la pantalla.
(2) No estaba haciendo esto como se muestra en la respuesta superior: CardView layout_width = "match_parent" no coincide con el ancho del RecyclerView padre
//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 configurar su
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 utilizando el último método. Si bien funciona, creo que también genera este error.
Se resuelve configurando la lista vacía inicializada y el adaptador en la parte inferior y llamando a notifyDataSetChanged cuando se obtienen resultados.
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
recyclerviewItems.setLayoutManager(linearLayoutManager);
someAdapter = new SomeAdapter(getContext(),feedList);
recyclerviewItems.setAdapter(someAdapter);
Simplemente agregue lo siguiente a
RecyclerView
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
Ejemplo:
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</android.support.v7.widget.RecyclerView>
Tengo la misma situación con usted, la pantalla está bien, pero aparece un error en la ubicación. Esa es mi solución: (1) Inicialice el adaptador RecyclerView & bind al crear ()
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 el dispatchLayout (), podemos encontrar que hay un error:
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 {
Tuve el mismo error, lo arreglé haciendo esto si está esperando datos como yo usando la actualización o algo así
Poner antes de Oncreate
private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;
Ponlos en tu Oncreate
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);
Cuando recibes datos puestos
adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);
Ahora ingrese a su clase ArtistArrayAdapter y haga lo que hará si su matriz está vacía o es nula, hará que GetItemCount devuelva 0, de lo contrario, tendrá el tamaño de la matriz de artistas
@Override
public int getItemCount() {
int a ;
if(artists != null && !artists.isEmpty()) {
a = artists.size();
}
else {
a = 0;
}
return a;
}
Tuve el mismo problema y me di cuenta de que estaba configurando tanto el LayoutManage r como el adaptador después de recuperar los datos de mi fuente en lugar de configurar los dos en el método onCreate .
salesAdapter = new SalesAdapter(this,ordersList);
salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
salesView.setAdapter(salesAdapter);
Luego notificó al adaptador sobre el cambio de datos
//get the Orders
Orders orders;
JSONArray ordersArray = jObj.getJSONArray("orders");
for (int i = 0; i < ordersArray.length() ; i++) {
JSONObject orderItem = ordersArray.getJSONObject(i);
//populate the Order model
orders = new Orders(
orderItem.getString("order_id"),
orderItem.getString("customer"),
orderItem.getString("date_added"),
orderItem.getString("total"));
ordersList.add(i,orders);
salesAdapter.notifyDataSetChanged();
}
tengo este problema, un problema de tiempo es reciclarView poner en objeto ScrollView
Después de verificar la implementación, el motivo parece ser el siguiente. Si RecyclerView se coloca en un ScrollView, entonces, durante el paso de medición, su altura no se especifica (porque ScrollView permite cualquier altura) y, como resultado, obtiene la altura mínima (según la implementación) que aparentemente es cero.
Tienes un par de opciones para arreglar esto:
- Establecer una cierta altura a RecyclerView
- Establezca ScrollView.fillViewport en verdadero
- O mantenga RecyclerView fuera de ScrollView. En mi opinión, esta es la mejor opción con diferencia. Si la altura de RecyclerView no está limitada, que es el caso cuando se coloca en ScrollView, entonces todas las vistas del Adaptador tienen suficiente lugar verticalmente y se crean de una vez. Ya no hay reciclaje de vistas, lo que rompe el propósito de RecyclerView.
(También se puede seguir para
android.support.v4.widget.NestedScrollView
)
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
Simplemente reemplace el código anterior con esto y debería funcionar. Lo que hizo mal es que llamó a setAdapter (adaptador) antes de llamar al administrador de diseño.