recyclerview Nenhum adaptador conectado; saltando layout

241

Apenas implementado RecyclerViewno meu código, substituindo ListView.

Tudo funciona bem. Os dados são exibidos.

Mas as mensagens de erro estão sendo registradas:

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

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

para o seguinte 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 você pode ver, anexei um adaptador para RecyclerView. Então, por que continuo recebendo esse erro?

Li outras perguntas relacionadas ao mesmo problema, mas nenhuma delas ajuda.

Equitharn
fonte
artistas estão vazios? o que acontece, você alterna setAdapter e setLayoutManager?
precisa
Você tem que usar um RecyclerView.Adapter
Octopus38
12
Você poderá vê-lo se não estiver inicializando a visualização de reciclagem assim que estiver anexada à janela.
yigit
1
@yigit Estou aguardando a atualização para fazer o download dos dados e, após a conclusão, o código fornecido é executado!
equitharn
3
Quão sério é esse erro? Isso pode ser ignorado? De qualquer forma eu uso setAdapter (null) para evitar o erro.
Priyankvex

Respostas:

243

Você pode ter certeza de que está chamando essas instruções do thread "principal" (por exemplo, dentro do onCreate()método). Assim que eu chamo as mesmas instruções de um método "atrasado". No meu caso a ResultCallback, recebo a mesma mensagem.

Na minha Fragment, chamar o código abaixo de dentro de um ResultCallbackmétodo produz a mesma mensagem. Depois de mover o código para o onConnected()método dentro do meu aplicativo, a mensagem desapareceu ...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Peter
fonte
9
Mas preciso baixar os dados primeiro e depois exibir!
equitharn
93
Basta definir um adaptador vazio primeiro, atualizá-lo assim que você tiver os dados (é isso que funciona para mim).
Peter
3
Isso é o que yigit sugeriu!
equitharn
13
@equitharn Primeiro você deve definir um adaptador vazio e, depois, fazer o download dos dados, chame mAdapter.notifyDataSetChanged (), que funcionou para mim.
precisa saber é o seguinte
2
Esta solução não está me ajudando. De fato, nenhuma solução neste segmento está me ajudando. Alguém pode por favor, olhar para o meu caso aqui
Pulak
41

Eu estava recebendo as mesmas duas mensagens de erro até corrigir duas coisas no meu código:

(1) Por padrão, quando você implementa métodos, RecyclerView.Adapterele gera:

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

Atualize seu código para que ele diga:

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

Obviamente, se você tiver zero itens em seus itens, receberá zero itens na tela.

(2) Eu não estava fazendo isso como mostrado na resposta superior: CardView layout_width = "match_parent" não corresponde à largura principal do 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) EDIT: BÔNUS: Também certifique-se de configurar o RecyclerViewseguinte:

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

Assim não:

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

Eu já vi alguns tutoriais usando o último método. Enquanto funciona, acho que gera esse erro também.

Micro
fonte
1
meu getItemCount () fica assim public int getItemCount() { return artists == null ? 0 : artists.size(); }e o LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
equitharn
isso funciona para mim: @Override public int getItemCount () {return artists.size (); }
AstonCheah
4
Oh Deus. Naquele momento em que você volta ao SO, vê uma resposta que já votou e percebe que estava fazendo a mesma coisa estúpida. Obrigado novamente @Micro.
androidevil
20

Eu tenho a mesma situação com você, a tela está ok, mas o erro aparece no local. Essa é a minha solução: (1) Inicialize o RecyclerView e o adaptador de ligação ON CREATE ()

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

(2) chame notifyDataStateChanged quando você obtiver os dados

adapter.notifyDataStateChanged();

No código-fonte do recyclerView, há outro encadeamento para verificar o estado dos dados.

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

            }
        }
    };

No dispatchLayout (), podemos encontrar o erro:

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
fonte
11

Eu tenho esse problema, algumas vezes o problema é recycleView colocado no objeto ScrollView

Após verificar a implementação, o motivo parece ser o seguinte. Se o RecyclerView for colocado em um ScrollView, durante a etapa de medição, sua altura não será especificada (porque o ScrollView permite qualquer altura) e, como resultado, será igual à altura mínima (conforme a implementação) que aparentemente é zero.

Você tem algumas opções para corrigir isso:

  1. Defina uma certa altura para RecyclerView
  2. Defina ScrollView.fillViewport como true
  3. Ou mantenha o RecyclerView fora do ScrollView. Na minha opinião, esta é a melhor opção de longe. Se a altura do RecyclerView não for limitada - como é o caso quando colocada no ScrollView -, todas as visualizações do adaptador terão lugar suficiente na vertical e serão criadas de uma só vez. Não há mais visualização de reciclagem que meio que quebra o objetivo do RecyclerView.

(Pode ser seguido android.support.v4.widget.NestedScrollViewtambém)

FxRi4
fonte
definir ScrollView.fillViewport como true resolveu meu problema, muito obrigado
Eman 17-19
10

1) Crie o ViewHolder que não faz nada :)

// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
    public SampleHolder(View itemView) {
        super(itemView);
    }
}

2) Crie novamente o RecyclerView que não faz 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) Agora, quando o seu reciclador real não estiver pronto, use a amostra como abaixo.

RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id);
myRecycler.setLayoutManager(new LinearLayoutManager(this));
myRecycler.setAdapter(new SampleRecycler());

Esta não é a melhor solução, mas funciona! Espero que isso seja útil.

Madan Sapkota
fonte
Oi, por favor, tenho o mesmo erro e não sei onde devo verificar se o reciclador não está pronto para passar um adaptador vazio) e onde posso verificar se o reciclador está pronto (para passar o adaptador com dados)
James
Isso é ótimo, aqui está um estilo de arrastar e soltar gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
nmu
9

Isso acontece quando você não está configurando o adaptador durante a fase de criação:

@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);
    ....
}

Basta mover a configuração do adaptador para onCreate com dados vazios e quando você receber a chamada de dados:

mAdapter.notifyDataSetChanged();
Peter File
fonte
certifique-se de definir dados no construtor costmadapter dentro do método onCreate
Mohit Singh
4

Verifique se você esqueceu de chamar esse método no seu adaptador

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

Certifique-se de definir o gerenciador de layout para o seu RecyclerView:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

Em vez de LinearLayoutManager, você também pode usar outros gerenciadores de layout.

Sumit Jha
fonte
3

Eu tive o mesmo erro, eu o corrigi fazendo isso se você estiver esperando por dados como eu usando o retrofit ou algo assim

Colocar antes de Oncreate

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

Coloque-os no seu 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);

Quando você recebe dados

adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);

Agora vá na sua classe ArtistArrayAdapter e faça o que ele fará: se sua matriz estiver vazia ou for nula, fará com que GetItemCount retorne 0, caso contrário, tornará o tamanho da matriz de artistas

@Override
public int getItemCount() {

    int a ;

    if(artists != null && !artists.isEmpty()) {

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}
user3277530
fonte
3

Essas linhas devem estar em OnCreate:

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

Isso acontece porque o layout inflado real é diferente daquele que está sendo referido por você ao encontrar o recyclerView. Por padrão, quando você cria o fragmento, o método onCreateView aparece da seguinte maneira: return inflater.inflate(R.layout.<related layout>,container.false);

Em vez disso, crie a visualização separadamente e use-a para se referir ao recyclerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;

Prateek Agarwal
fonte
2

Inicialize primeiro o 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);
}

Sempre que houver uma alteração no conjunto de dados, chame o método updateComments.

Roger
fonte
2

Para quem usa o RecyclerViewdentro de um fragmento e o inflaciona de outras visualizações: ao inflar a visualização inteira do fragmento, certifique-se de vincular a RecyclerViewà visualização raiz.

Eu estava conectando e fazendo tudo pelo adaptador corretamente, mas nunca fiz a ligação. Esta resposta de @Prateek Agarwal tem tudo para mim, mas aqui está mais elaboração.

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
fonte
1
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

Basta substituir o código acima por este e ele deve funcionar. O que você fez de errado foi chamado setAdapter (adaptador) antes de chamar o gerenciador de layout.

Pradeep Bogati
fonte
1

Este é realmente um erro simples que você está recebendo, não sendo necessário fazer nenhum código. Este erro ocorre devido ao arquivo de layout errado usado pela atividade. Pelo IDE, criei automaticamente um layout v21 de um layout que se tornou um layout padrão da atividade. todos os códigos que fiz no arquivo de layout antigo e o novo estava com apenas alguns códigos xml, o que levou a esse erro.

Solução: Copie todos os códigos do layout antigo e cole no layout v 21

Vikash Sharma
fonte
1

No meu caso, eu estava configurando o adaptador dentro de onLocationChanged()retorno de chamada E depurando no emulador. Como não detectou uma alteração de local, nunca foi acionado. Quando eu os defino manualmente nos controles estendidos do emulador, ele funcionou conforme o esperado.

saiyancoder
fonte
1

Eu resolvi esse erro. Você só precisa adicionar o gerenciador de layout e adicionar o adaptador vazio.

Como 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
fonte
1
i fazê-lo para usuários iniciantes
Mehdi janbarari
1

Basta adicionar o seguinte a RecyclerView

app:layoutManager="android.support.v7.widget.LinearLayoutManager"

Exemplo:

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

Eu tive esse erro e tentei corrigir por um tempo até encontrar a solução.

Criei um método privado buildRecyclerView e o chamei duas vezes, primeiro no onCreateView e depois no meu retorno de chamada (no qual busco dados de uma API). Este é o meu método buildRecyclerView no meu 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);
}

Além disso, tenho que modificar o método get-Item-Count no meu adaptador, porque On on-Create-View a lista é nula e através de um erro. Portanto, meu get-Item-Count é o seguinte:

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

    }
Zeke
fonte
0

Na minha situação, era um componente esquecido que se localiza na classe ViewHolder, mas não estava localizado no arquivo de layout

lomec
fonte
0

I teve o mesmo problema e realizou I foi configuração tanto o LayoutManage r e adaptador depois de recuperar os dados do meu fonte em vez de fixar as duas no onCreate método.

salesAdapter = new SalesAdapter(this,ordersList);
        salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        salesView.setAdapter(salesAdapter);

Em seguida, notificou o adaptador sobre alteração de dados

               //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
fonte
0

Esse problema ocorre porque você não está adicionando nenhum LayoutManagerpara o seu RecyclerView.

Outro motivo é porque você está chamando esse código em um NonUIThread. Certifique-se de ligar para esta chamada no UIThread.

A solução é só você tem que adicionar um LayoutManagerpara o RecyclerViewantes setAdapterno segmento.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Khalid Taha
fonte
Se você precisar adiar a configuração do LayoutManager, faça isso com o método de retorno de chamada: recyclerView.post (() -> {recyclerView.setLayoutManager (mGridLayoutManager); recyclerView.addItemDecoration (novo ItemOffsetDecoration (itemGap));});
Ievgen
0

Meu problema era que minha visão do reciclador era assim

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

Quando deveria ter ficado assim

       <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
fonte
0

Na sua RecyclerViewclasse de adaptador, por exemplo MyRecyclerViewAdapter, faça um construtor com os seguintes 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;
}

mDatasão os dados que você passará para o adaptador. É opcional se você não tiver dados a serem transmitidos. mInflateré o LayoutInflaterobjeto que você criou e utiliza na OnCreateViewHolderfunção do adaptador.

Depois disso, conecte o adaptador na MainActivity ou onde quiser no thread principal / UI adequadamente, 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
fonte
0

Resolvido configurando a lista vazia inicializada e o adaptador na parte inferior e chamando notifyDataSetChanged quando os resultados são buscados.

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerviewItems.setLayoutManager(linearLayoutManager);
    someAdapter = new SomeAdapter(getContext(),feedList);
    recyclerviewItems.setAdapter(someAdapter);
Tabraiz Malik
fonte
0

Perdi 16 minutos da minha vida com esse problema, então vou admitir esse erro incrivelmente embaraçoso que estava cometendo - estou usando o Butterknife e vinculo a visualização no onCreateView neste fragmento.

Demorou muito tempo para descobrir por que eu não tinha um gerenciador de layout - mas, obviamente, as visualizações são injetadas para que não sejam realmente nulas; portanto, o reciclador nunca será nulo.

@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));
}

Se você estiver tendo um problema como esse, rastreie sua visualização e use algo como uiautomatorviewer

Saik Caskey
fonte
0

Não tenho muita resposta, mas também estava com o mesmo problema, mesmo com o código correto. Às vezes, é apenas a mais simples das marcas. Nesse caso, o erro do OP também pode estar ausente <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />no manifesto, que reproduz o mesmo erro.

SpicyWeenie
fonte
0

No meu caso, aconteceu porque eu incorporei um RecyclerView em um LinearLayout.

Anteriormente, eu tinha um arquivo de layout contendo apenas um RecyclerView raiz da seguinte maneira

<?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"/>

Eu acredito que o problema está dentro das 3 linhas separadas. De qualquer forma, acho que é um problema simples, vou trabalhar nisso amanhã; pensei que deveria escrever o que encontrei antes de esquecer esta discussão.

SoliQuiD
fonte
0

Adicionando mais uma resposta desde que me deparei com este tópico pesquisando o erro no Google. Eu estava tentando inicializar umPreferenceFragmentCompat mas eu esqueci de inflar a preferência XML da onCreatePreferencesseguinte maneira:

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)
    }
}

O erro foi um mistério até que percebi que PreferenceFragmentCompatdevia estar usando um RecyclerViewinternamente.

aschmied
fonte
0

// Isso acontece quando você não está configurando o adaptador durante a fase de criação: ligue notifyDataSetChanged () quando a resposta da API estiver recebendo seu funcionamento

@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
fonte