recyclerview Aucun adaptateur attaché; sauter la disposition

241

Juste implémenté RecyclerViewdans mon code, en remplacement ListView.

Tout fonctionne bien. Les données s'affichent.

Mais les messages d'erreur sont enregistrés:

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

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

pour le code suivant:

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

Comme vous pouvez le voir, j'ai joint un adaptateur pour RecyclerView. Alors pourquoi est-ce que je continue à recevoir cette erreur?

J'ai lu d'autres questions liées au même problème, mais aucune ne m'aide.

equitharn
la source
les artistes sont-ils vides? que se passe-t-il lorsque vous changez setAdapter et setLayoutManager?
Blackbelt
Vous devez utiliser un RecyclerView.Adapter
Octopus38
12
Vous pouvez le voir si vous n'initialisez pas recyclerview dès qu'il est attaché à la fenêtre.
Yigit
1
@yigit J'attends une modification pour télécharger des données et une fois terminé, le code donné s'exécute!
equitharn
3
Quelle est la gravité de cette erreur? Peut-on ignorer cela? Quoi qu'il en soit, j'utilise setAdapter (null) pour éviter l'erreur.
priyankvex

Réponses:

243

Pouvez-vous vous assurer d'appeler ces instructions à partir du thread "principal" (par exemple à l'intérieur de la onCreate()méthode). Dès que j'appelle les mêmes déclarations à partir d'une méthode "différée". Dans mon cas ResultCallback, j'ai le même message.

Dans my Fragment, appeler le code ci-dessous depuis l'intérieur d'une ResultCallbackméthode produit le même message. Après avoir déplacé le code vers la onConnected()méthode de mon application, le message avait disparu ...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Peter
la source
9
Mais je dois d'abord télécharger les données puis les afficher!
equitharn
93
Réglez d'abord un adaptateur vide, mettez-le à jour dès que vous avez les données (c'est ce qui fonctionne pour moi).
Peter
3
C'est ce que Yigit a suggéré!
equitharn
13
@equitharn Vous devez d'abord définir un adaptateur vide, puis les données sont téléchargées, appelez mAdapter.notifyDataSetChanged (), qui fonctionne pour moi.
DomonLee
2
Cette solution ne m'aide pas. En fait, aucune solution dans ce fil ne m'aide. Quelqu'un peut-il examiner mon cas ici
Pulak
41

J'obtenais les mêmes deux messages d'erreur jusqu'à ce que je corrige deux choses dans mon code:

(1) Par défaut, lorsque vous implémentez des méthodes dans le, RecyclerView.Adapteril génère:

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

Assurez-vous de mettre à jour votre code pour qu'il indique:

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

Évidemment, si vous n'avez aucun élément dans vos éléments, vous n'aurez aucun élément affiché à l'écran.

(2) Je ne faisais pas cela comme indiqué dans la réponse du haut: CardView layout_width = "match_parent" ne correspond pas à la largeur de RecyclerView parent

//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: BONUS: Assurez-vous également de configurer votre RecyclerViewcomme ceci:

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

Pas comme ça:

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

J'ai vu quelques tutoriels utilisant cette dernière méthode. Bien que cela fonctionne, je pense que cela génère également cette erreur.

Micro
la source
1
mon getItemCount () ressemble à ceci public int getItemCount() { return artists == null ? 0 : artists.size(); }et le LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
equitharn
cela fonctionne pour moi: @Override public int getItemCount () {return artists.size (); }
AstonCheah
4
Oh mon Dieu. Ce moment où vous revenez à SO, et voyez une réponse que vous avez déjà votée, et réalisez que vous faisiez la même chose stupide. Merci encore @Micro.
androidevil
20

J'ai la même situation avec vous, l'affichage est ok, mais une erreur apparaît dans le locat. C'est ma solution: (1) Initialiser l'adaptateur RecyclerView & bind ON CREATE ()

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

(2) appelez notifyDataStateChanged lorsque vous obtenez les données

adapter.notifyDataStateChanged();

Dans le code source de recyclerView, il existe un autre thread pour vérifier l'état des données.

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

            }
        }
    };

Dans le dispatchLayout (), nous pouvons trouver qu'il y a l'erreur:

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
la source
11

j'ai ce problème, un problème de temps est recycleView mis dans l' objet ScrollView

Après avoir vérifié l'implémentation, la raison semble être la suivante. Si RecyclerView est placé dans un ScrollView, alors pendant l'étape de mesure, sa hauteur n'est pas spécifiée (car ScrollView autorise n'importe quelle hauteur) et, par conséquent, devient égale à la hauteur minimale (selon l'implémentation) qui est apparemment nulle.

Vous avez deux options pour résoudre ce problème:

  1. Réglez une certaine hauteur sur RecyclerView
  2. Définissez ScrollView.fillViewport sur true
  3. Ou laissez RecyclerView en dehors de ScrollView. À mon avis, c'est de loin la meilleure option. Si la hauteur de RecyclerView n'est pas limitée - ce qui est le cas lorsqu'il est placé dans ScrollView - alors toutes les vues de l'adaptateur ont suffisamment de place verticalement et sont créées en une seule fois. Il n'y a plus de recyclage de vue qui rompt un peu l'objectif de RecyclerView.

(Peut également être suivi android.support.v4.widget.NestedScrollView)

FxRi4
la source
définir ScrollView.fillViewport sur true a résolu mon problème, merci beaucoup
Eman
10

1) Créez un ViewHolder qui ne fait rien :)

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

2) Créez à nouveau RecyclerView qui ne fait rien :)

// 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) Maintenant, lorsque votre véritable recycleur n'est pas prêt, utilisez simplement l'échantillon comme ci-dessous.

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

Ce n'est pas la meilleure solution, mais cela fonctionne! J'espère que cela vous sera utile.

Madan Sapkota
la source
Salut, s'il vous plaît j'ai la même erreur et je ne sais pas où je dois vérifier si le recycleur n'est pas prêt à passer un adaptateur vide) et où je peux vérifier si le recycleur est prêt (à passer l'adaptateur avec des données)
James
C'est super, voici un style de drag'n drop gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
nmu
9

Cela se produit lorsque vous ne définissez pas l'adaptateur pendant la phase de création:

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

Déplacez simplement la configuration de l'adaptateur dans onCreate avec des données vides et lorsque vous avez l'appel de données:

mAdapter.notifyDataSetChanged();
Fichier Peter
la source
assurez-vous de définir les données dans le constructeur de l'adaptateur personnalisé dans la méthode onCreate
Mohit Singh
4

Vérifiez si vous avez manqué d'appeler cette méthode dans votre adaptateur

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

Assurez-vous de définir le gestionnaire de disposition pour votre RecyclerView en:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

Au lieu de LinearLayoutManager, vous pouvez également utiliser d' autres gestionnaires de disposition.

Sumit Jha
la source
3

J'ai eu la même erreur, je l'ai corrigé en faisant cela si vous attendez des données comme moi en utilisant la modification ou quelque chose comme ça

Mettre avant Oncréer

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

Mettez-les dans votre 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);

Lorsque vous recevez des données mises

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

Maintenant, allez dans votre classe ArtistArrayAdapter et faites ce que cela fera si votre tableau est vide ou est nul cela fera que GetItemCount retournera 0 sinon il fera la taille du tableau d'artistes

@Override
public int getItemCount() {

    int a ;

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

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}
user3277530
la source
3

Ces lignes doivent être en OnCreate:

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

Cela se produit car la disposition gonflée réelle est différente de celle que vous avez référée lors de la recherche de recyclerView. Par défaut, lorsque vous créez le fragment, la méthode onCreateView apparaît comme suit: return inflater.inflate(R.layout.<related layout>,container.false);

Au lieu de cela, créez séparément la vue et utilisez-la pour faire référence à recyclerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;

Prateek Agarwal
la source
2

Initialiser d'abord l'adaptateur

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

Chaque fois qu'il y a un changement dans l'ensemble de données, il suffit d'appeler la méthode updateComments.

Roger
la source
2

Pour ceux qui utilisent l' RecyclerViewintérieur d'un fragment et le gonflent à partir d'autres vues: lorsque vous gonflez la vue entière du fragment, assurez-vous de lier le RecyclerViewà sa vue racine.

Je me connectais et faisais tout pour l'adaptateur correctement, mais je n'ai jamais fait la liaison. Cette réponse de @Prateek Agarwal a tout pour moi, mais voici plus de détails.

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

Remplacez simplement le code ci-dessus par ceci et cela devrait fonctionner. Ce que vous avez fait de mal, c'est que vous avez appelé setAdapter (adaptateur) avant d'appeler le gestionnaire de disposition.

Pradeep Bogati
la source
1

C'est vraiment une simple erreur que vous obtenez, il n'est pas nécessaire de faire de codes dans ce domaine. Cette erreur se produit en raison d'un fichier de mise en page incorrect utilisé par l'activité. Par IDE, j'ai automatiquement créé une mise en page v21 d'une mise en page qui est devenue une mise en page par défaut de l'activité. tous les codes que j'ai faits dans l'ancien fichier de mise en page et le nouveau ne contenaient que quelques codes xml, ce qui a conduit à cette erreur.

Lösung: Copiez tous les codes de la vieille disposition et collez dans la disposition v 21

Vikash Sharma
la source
1

Dans mon cas, je mettais l'adaptateur dans le onLocationChanged()rappel ET le débogage dans l'émulateur. Comme il n'a pas détecté de changement d'emplacement, il n'a jamais tiré. Lorsque je les ai définis manuellement dans les contrôles étendus de l'émulateur, cela a fonctionné comme prévu.

saiyancoder
la source
1

J'ai résolu cette erreur. Il vous suffit d'ajouter un gestionnaire de disposition et d'ajouter l'adaptateur vide.

Comme ce code:

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
la source
1
je le fais pour les utilisateurs débutants
mehdi janbarari
1

Ajoutez simplement ce qui suit à RecyclerView

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

Exemple:

   <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
la source
1

J'ai eu cette erreur et j'ai essayé de la réparer pendant un certain temps jusqu'à ce que je trouve la solution.

J'ai créé une méthode privée buildRecyclerView, et je l'ai appelée deux fois, d'abord sur onCreateView, puis après mon rappel (dans lequel je récupère des données à partir d'une API). Voici ma méthode buildRecyclerView dans mon fragment:

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

En outre, je dois modifier la méthode get-Item-Count dans mon adaptateur, car sur On-Create-View la liste est nulle et cela par une erreur. Donc, mon get-Item-Count est le suivant:

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

    }
Zeke
la source
0

Dans ma situation, c'était un composant oublié qui se trouve dans la classe ViewHolder mais il ne se trouvait pas dans le fichier de disposition

lomec
la source
0

J'ai eu le même problème et j'ai réalisé que je définissais à la fois LayoutManage r et l' adaptateur après avoir récupéré les données de ma source au lieu de définir les deux dans la méthode onCreate .

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

Puis a informé l'adaptateur de la modification des données

               //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
la source
0

Ce problème est dû au fait que vous n'en ajoutez pas LayoutManagerpour votre compte RecyclerView.

Une autre raison est que vous appelez ce code dans un NonUIThread. Assurez-vous d'appeler cet appel dans l'UIThread.

La solution est seulement que vous devez ajouter un LayoutManagerpour l' RecyclerViewavant setAdapterdans le thread d'interface utilisateur.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Khalid Taha
la source
Si vous devez retarder la configuration de LayoutManager, vous devez le faire à partir de votre méthode de rappel: recyclerView.post (() -> {recyclerView.setLayoutManager (mGridLayoutManager); recyclerView.addItemDecoration (new ItemOffsetDecoration (itemGap));});
ievgen
0

Mon problème était que ma vue de recycleur ressemblait à ceci

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

Quand ça aurait dû ressembler à ça

       <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
la source
0

Dans votre RecyclerViewclasse d'adaptateur, par exemple MyRecyclerViewAdapter, créez un constructeur avec les paramètres suivants.

MyRecyclerViewAdapter(Context context, List<String> data) {
    this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
    this.mData = data;
}

mDatasont les données que vous transmettez à l'adaptateur. Il est facultatif si vous n'avez aucune donnée à transmettre. mInflaterest l' LayoutInflaterobjet que vous avez créé et que vous utilisez dans la OnCreateViewHolderfonction de l'adaptateur.

Après cela, vous attachez l'adaptateur dans MainActivity ou où vous le souhaitez sur le thread principal / UI correctement, comme

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
la source
0

Résolu en définissant la liste vide initialisée et l'adaptateur en bas et en appelant notifyDataSetChanged lorsque les résultats sont récupérés.

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

J'ai perdu 16 minutes de ma vie avec ce problème, donc je vais simplement admettre cette erreur incroyablement embarrassante que je faisais - j'utilise Butterknife et je lie la vue dans onCreateView dans ce fragment.

Il a fallu beaucoup de temps pour comprendre pourquoi je n'avais pas de gestionnaire de mise en page - mais de toute évidence, les vues sont injectées afin qu'elles ne soient pas réellement nulles, de sorte que le recycleur ne sera jamais nul .. oups!

@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 vous rencontrez un problème comme celui-ci, tracez votre point de vue et utilisez quelque chose comme uiautomatorviewer

Saik Caskey
la source
0

Pas beaucoup de réponse mais j'avais aussi le même problème avec le code correct. Parfois, c'est juste la plus simple des marques. Dans ce cas, l'erreur du PO peut également être manquante <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />dans le manifeste, qui reproduit la même erreur.

SpicyWeenie
la source
0

Dans mon cas, cela s'est produit car j'ai intégré un RecyclerView dans un LinearLayout.

J'avais auparavant un fichier de mise en page contenant uniquement un RecyclerView racine comme suit

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

Je crois que le problème est dans les 3 lignes séparées. Quoi qu'il en soit, je pense que c'est un problème simple, je ne travaillerai pas dessus demain; pensé que je devrais écrire ce que j'ai trouvé avant d'oublier ce fil.

SoliQuiD
la source
0

Ajout d'une autre réponse depuis que je suis tombé sur ce fil googler l'erreur. J'essayais d'initialiser un PreferenceFragmentCompatmais j'ai oublié de gonfler la préférence XML onCreatePreferencescomme ceci:

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

L'erreur était un mystère jusqu'à ce que je réalise que cela PreferenceFragmentCompatdevait être utilisé en RecyclerViewinterne.

aschmied
la source
0

// Cela se produit lorsque vous ne définissez pas l'adaptateur pendant la phase de création: appelez notifyDataSetChanged () lorsque la réponse api obtient son fonctionnement

@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
la source