studio recyclerview make how ejemplo dependency create card and android android-recyclerview recycler-adapter

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.

  1. Haga esto si está utilizando el emulador.

android: usesCleartextTraffic = "true"

  1. 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

  1. 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:

  1. Establecer una cierta altura a RecyclerView
  2. Establezca ScrollView.fillViewport en verdadero
  3. 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.