vista de reciclaje No hay adaptador conectado; diseño omitido

241

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 puede 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 de ellas ayuda.

equitharn
fuente
¿los artistas están vacíos? ¿Qué sucede si cambias setAdapter y setLayoutManager?
Blackbelt
Tienes que usar un RecyclerView.Adapter
Octopus38
12
Es posible que lo vea si no está inicializando la vista del reciclador tan pronto como se adjunte a la ventana.
yigit
1
@yigit ¡Estoy esperando la actualización para descargar datos y después de que termine se ejecuta el código dado!
equitharn
3
¿Qué tan serio es este error? ¿Se puede ignorar esto? De todos modos uso setAdapter (nulo) para evitar el error.
priyankvex

Respuestas:

243

¿Puede asegurarse de que está llamando a estas declaraciones desde el hilo "principal" (por ejemplo, dentro del onCreate()método). Tan pronto como llamo a las mismas declaraciones de un método "retrasado". En mi caso a ResultCallback, recibo el mismo mensaje.

En mi Fragment, llamar al siguiente código desde 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
fuente
99
¡Pero primero necesito descargar los datos y luego mostrarlos!
equitharn 01 de
93
Simplemente configure primero un adaptador vacío, actualícelo tan pronto como tenga los datos (esto es lo que funciona para mí).
Peter
3
¡Eso es lo que sugirió Yigit!
equitharn 01 de
13
@equitharn Primero debe configurar un adaptador vacío, y luego se descargan los datos, llame a mAdapter.notifyDataSetChanged (), eso me funcionó.
DomonLee
2
Esta solución no me está ayudando. De hecho, ninguna solución en este hilo me está ayudando. ¿Puede alguien mirar mi caso aquí
Pulak
41

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 el RecyclerView.Adaptergenera:

@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 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 utilizando el último método. Si bien funciona, creo que también genera este error.

Micro
fuente
1
mi getItemCount () se ve así public int getItemCount() { return artists == null ? 0 : artists.size(); }y LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
equitharn
esto funciona para mí: @Override public int getItemCount () {return artists.size (); }
AstonCheah
44
Oh Dios. En ese momento cuando vuelves a SO, y ves una respuesta que ya votaste, y te das cuenta de que estabas haciendo la misma estupidez. Gracias de nuevo @Micro.
androidevil
20

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 {
Keith Gong
fuente
11

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, se iguala a la altura mínima (según la implementación) que aparentemente es cero.

Tiene un par de opciones para solucionar 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.

(Se puede seguir android.support.v4.widget.NestedScrollViewtambién)

FxRi4
fuente
establecer ScrollView.fillViewport en verdadero resolvió mi problema, muchas gracias
Eman
10

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.

Madan Sapkota
fuente
Hola, por favor, tengo el mismo error y no sé dónde debo verificar si el reciclador no está listo para pasar un adaptador vacío) y dónde puedo verificar si el reciclador está listo (para pasar el adaptador con datos)
James
Esto es muy bueno, he aquí una Drag'n estilo gota GIST gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
NMU
9

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();
Peter File
fuente
asegúrese de establecer los datos en el constructor customadapter dentro del método onCreate
Mohit Singh
4

Comprueba si no has llamado a este método en tu adaptador

@Override
public int getItemCount() {
    return list.size();
}
Shabbir Ahmed
fuente
3

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 otros administradores de diseño.

Sumit Jha
fuente
3

Tuve el mismo error, lo arreglé haciendo esto si está esperando datos como yo usando la actualización o algo así

Poner antes de crear

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;
}
usuario3277530
fuente
3

Estas líneas deben estar en OnCreate:

mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
Mallikarjun Dodmani
fuente
2

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 úsela para hacer referencia a recyclerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;

Prateek Agarwal
fuente
2

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.

Roger
fuente
2

Para aquellos que usan RecyclerViewdentro de un fragmento y lo inflan desde otras vistas: al inflar la vista de fragmento completo, asegúrese de vincularlo RecyclerViewa su vista raíz.

Estaba conectando y haciendo todo por el adaptador correctamente, pero nunca hice el enlace. Esta respuesta 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;
}
N. Osil
fuente
1
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.

Pradeep Bogati
fuente
1

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 anterior y en el nuevo solo tenían algunos 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

Vikash Sharma
fuente
1

En mi caso, estaba configurando el adaptador dentro de la onLocationChanged()devolución de llamada Y la depuración 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.

saiyancoder
fuente
1

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
//}
mehdi janbarari
fuente
1
lo hago para usuarios principiantes
mehdi janbarari
1

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>
Alan Deep
fuente
1

Tuve este error e intenté arreglarlo por un tiempo hasta que encontré la solución.

Hice un método privado buildRecyclerView, y lo llamé dos veces, primero en onCreateView y luego después de mi devolución de llamada (en la que obtengo datos de una API). Este es mi método buildRecyclerView en mi Fragmento:

private void buildRecyclerView(View v) {
        mRecyclerView = v.findViewById(R.id.recycler_view_loan);
        mLayoutManager = new LinearLayoutManager(getActivity());
        ((LinearLayoutManager) mLayoutManager).setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new LoanAdapter(mExampleList);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
}

Además, tengo que modificar el método get-Item-Count en mi adaptador, porque en On-Create-View la lista es nula y se produce un error. Entonces, mi get-Item-Count es el siguiente:

@Override
    public int getItemCount() {
        try {
            return mLoanList.size();
        } catch (Exception ex){return 0;}

    }
Zeke
fuente
0

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

lomec
fuente
0

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();
                    }
ovicko
fuente
0

Este problema se debe a que no está agregando ninguno LayoutManagerpara su RecyclerView.

Otra razón es porque está llamando a este código en un NonUIThread. Asegúrese de llamar a esta llamada en UIThread.

La solución es solo que tiene que agregar un LayoutManagerpara RecyclerViewantes setAdapteren el subproceso de interfaz de usuario.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Khalid Taha
fuente
Si necesita retrasar la configuración de LayoutManager, debe hacerlo desde su método de devolución de llamada: recyclerView.post (() -> {recyclerView.setLayoutManager (mGridLayoutManager); recyclerView.addItemDecoration (new ItemOffsetDecoration (itemGap));});
ievgen
0

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 haber parecido 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>
Kingsley Mitchell
fuente
0

En su RecyclerViewclase de adaptador, por ejemplo MyRecyclerViewAdapter, cree 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;
}

mDatason los datos que pasará al adaptador. Es opcional si no tiene datos para pasar. mInflateres el LayoutInflaterobjeto que ha creado y que utiliza en la OnCreateViewHolderfunción 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);
    }
   ....
Neil Agarwal
fuente
0

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);
Tabraiz Malik
fuente
0

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

Saik Caskey
fuente
0

No era una gran respuesta, pero también tenía el mismo problema, incluso con el código correcto. A veces, es 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" />en el Manifiesto, que reproduce el mismo error.

SpicyWeenie
fuente
0

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, mañana estaré trabajando en ello; Pensé que debería escribir lo que encontré antes de olvidarme de este hilo.

SoliQuiD
fuente
0

Añadiendo otra respuesta desde que encontré este hilo buscando en Google el error. Estaba tratando de inicializar un PreferenceFragmentCompatpero olvidé inflar el XML de preferencia de onCreatePreferencesesta manera:

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 PreferenceFragmentCompatdebe estar usando RecyclerViewinternamente.

asustado
fuente
0

// Esto ocurre cuando no está configurando el adaptador durante la fase de creación: Llamada notifyDataSetChanged () cuando la respuesta de la API está recibiendo Su Trabajo

@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();
Keshav Gera
fuente