recyclerview Geen adapter aangesloten; lay-out overslaan

Ik heb zojuist RecyclerViewin mijn code geïmplementeerd, ter vervanging van ListView.

Alles werkt prima. De gegevens worden weergegeven.

Maar er worden foutmeldingen gelogd:

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

voor de volgende code:

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

Zoals je kunt zien heb ik een adapter voor RecyclerViewaangesloten.
Dus waarom krijg ik deze foutmelding steeds?

Ik heb andere vragen gelezen over hetzelfde probleem, maar geen enkele helpt.


Antwoord 1, autoriteit 100%

Kun je ervoor zorgen dat je deze statements aanroept vanuit de “main” thread buiten een vertraagde asynchrone callback (bijvoorbeeld binnen de onCreate()methode).
Zodra ik dezelfde statements aanroep vanuit een “vertraagde” methode. In mijn geval een ResultCallback, krijg ik dezelfde melding.

In mijn Fragmentlevert het aanroepen van de onderstaande code vanuit een ResultCallback-methode hetzelfde bericht op. Na het verplaatsen van de code naar de onConnected()-methode in mijn app, was het bericht verdwenen…

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );

Antwoord 2, Autoriteit 18%

Ik kreeg dezelfde twee foutmeldingen totdat ik twee dingen in mijn code heb opgelost:

(1) Standaard, wanneer u methoden implementeert in de RecyclerView.Adaptergenereert:

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

Zorg ervoor dat u uw code bijwerkt, zodat deze zegt:

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

Uiteraard als u nul-items in uw items hebt, krijgt u nul dingen die op het scherm worden weergegeven.

(2) Ik doe dit niet zoals getoond in het bovenste antwoord: Cardview Layout_width =” Match_Parent “komt niet overeen met ouder recycerview breedte

//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) bewerken: bonus:
Zorg er ook voor dat u uw RecyclerViewals volgt instelt:

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

Niet zoals deze:

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

Ik heb een aantal tutorials gezien die de laatste methode gebruiken. Hoewel het werkt, denk ik dat het deze fout ook genereert.


Antwoord 3, autoriteit 9%

Ik heb dezelfde situatie met jou, weergave is ok, maar er verschijnt een fout in de locatie.
Dat is mijn oplossing:
(1) Initialiseer de RecyclerView & bind-adapter AAN MAKEN()

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

(2) bel notifyDataStateChanged aan wanneer u de gegevens krijgt

adapter.notifyDataStateChanged();

In de broncode van recyclerView is er een andere thread om de staat van de gegevens te controleren.

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

In de DispatchLayout (), kunnen we vinden dat er de fout in is:

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 {

Antwoord 4, Autoriteit 5%

Ik heb dit probleem, een paar keerprobleem is recycleview in scrollview object

Na het controleren van de implementatie, lijkt de reden het volgende te zijn. Als Recyclerview in een scrollview wordt geplaatst, is de hoogte tijdens meetstap niet gespecificeerd (omdat ScrollView elke hoogte mogelijk maakt) en, daardoor, gelijk is aan minimumhoogte (volgens de uitvoering) die blijkbaar nul is.

U hebt een paar opties om dit te bevestigen:

  1. Stel een bepaalde hoogte in op recycerview
  2. Set ScrollView.FillViewPoort naar TRUE
  3. of houd recycerview buiten de scrollview. Naar mijn mening is dit veruit de beste optie. Als Recycerview hoogte niet beperkt is – wat het geval is wanneer het in scrollview wordt geplaatst – dan hebben de weergaven van alle adapter voldoende verticaal en worden ze allemaal tegelijk gemaakt. Er is geen enkele keer recycling meer die een beetje het doel van recycerview doorbrengt.

(kan worden gevolgd voor android.support.v4.widget.NestedScrollViewOok)


Antwoord 5, Autoriteit 4%

Het gebeurt wanneer u de adapter niet instelt tijdens de creatiefase:

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

Verplaats de adapter gewoon naar onCreate met lege gegevens en wanneer u de gegevensoproep hebt:

mAdapter.notifyDataSetChanged();

Antwoord 6, autoriteit 4%

1) Maak een ViewHolderdie dat wel doet niets 🙂

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

2) Maak opnieuw RecyclerViewdie doet niets 🙂

// 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) Als je echte recycler er nog niet klaar voor is, gebruik dan gewoon het voorbeeld zoals hieronder.

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

Dit is echter niet de beste oplossing, maar het werkt! Ik hoop dat dit nuttig is.


Antwoord 7, autoriteit 2%

Zorg ervoor dat u de lay-outmanager voor uw RecyclerView instelt door:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

In plaats van LinearLayoutManagerkunt u anderelay-outbeheerders ook.


Antwoord 8, autoriteit 2%

Controleer of u deze methode in uw adapter heeft gemist

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

Antwoord 9, autoriteit 2%

Ik had dezelfde fout. Ik heb het opgelost door dit te doen als je wacht op gegevens zoals ik met behulp van retrofit of iets dergelijks

Zet voor Oncreate

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

Zet ze in je 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);

Als u gegevens ontvangt

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

Ga nu naar je ArtistArrayAdapter-klasse en doe dit. Als je array leeg of null is, zal GetItemCount 0 teruggeven, anders wordt het de grootte van de array van artiesten

@Override
public int getItemCount() {
    int a ;
    if(artists != null && !artists.isEmpty()) {
        a = artists.size();
    }
    else {
        a = 0;
     }
   return a;
}

Antwoord 10

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

Vervang gewoon bovenstaande code hiermee en het zou moeten werken. Wat je verkeerd hebt gedaan, is dat je setAdapter(adapter) hebt gebeld voordat je de lay-outmanager hebt gebeld.


Antwoord 11

Deze regels moeten in OnCreatestaan:

mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);

Antwoord 12

Voor degenen die de RecyclerViewbinnen een fragmentgebruiken en het vanuit andere weergaven opblazen: zorg er bij het opblazen van de hele fragmentweergave voor dat u de RecyclerViewnaar de hoofdweergave.

Ik maakte verbinding en deed alles voor de adapter correct, maar ik heb de binding nooit gedaan.
Deze antwoord door @Prateek Agarwal heeft het allemaal voor mij, maar hier is meer uitwerking.

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

Antwoord 13

In Kotlin hadden we dit rare onlogische probleem.

Dit werkte niet:

mBinding.serviceProviderCertificates.apply {
            adapter = adapter
            layoutManager =  LinearLayoutManager(activity)
        }

Hoewel dit werkte:

mBinding.serviceProviderCertificates.adapter = adapter
mBinding.serviceProviderCertificates.layoutManager = LinearLayoutManager(activity)

Als ik eenmaal meer na de werkuren krijg, zal ik meer inzichten delen.


Antwoord 14

Dit gebeurt omdat de eigenlijke opgeblazen lay-out anders is dan die door u wordt doorverwezen tijdens het vinden van de recycerview. Standaard Wanneer u het fragment maakt, verschijnt de Oncreateview-methode als volgt:
return inflater.inflate(R.layout.<related layout>,container.false);

In plaats daarvan maakt u afzonderlijk de weergave en gebruik deze om naar recycerview te verwijzen
View view= inflater.inflate(R.layout.<related layout>,container.false);
recyclerview=view.findViewById(R.id.<recyclerView ID>);
return view;


Antwoord 15

Initialiseer eerst de adapter

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

Wanneer er ooit een wijziging is in de dataset-set, bel dan gewoon de updatecomections-methode.


Antwoord 16

Ik had deze fout, en ik probeerde een tijdje te repareren totdat ik de oplossing vond.

Ik heb een particuliere methode buildrecyclerview gemaakt en ik noemde het twee keer, eerst op oncreateview en vervolgens na mijn callback (waarin ik gegevens van een API haalt). Dit is mijn methode buildrecyclerview in mijn 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);
}

Bovendien moet ik de methode Get-Item-Count in My Adapter wijzigen, omdat de lijst op On-Collection de lijst null en deze door een fout is. Dus mijn get-item-aantal is het volgende:

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

Antwoord 17

Dit is echt een eenvoudige fout die u krijgt, het is niet nodig om hierin geen codes in te dienen.
Deze fout treedt op als gevolg van het verkeerde lay-outbestand dat door de activiteit wordt gebruikt. Door IDE heeft ik automatisch een lay-out V21 van een lay-out gemaakt die een standaardlay-out van de activiteit werd.
Alle codes die ik deed in het oude lay-outbestand en nieuwe had slechts enkele XML-codes, die tot die fout hebben geleid.

Oplossing: kopieer alle codes van oude lay-out en plakken in Layout V 21


Antwoord 18

In mijn geval, ik instelde de adapter binnen onLocationChanged()callback en debugging in de emulator. Omdat het een locatie van de locatie niet heeft gedetecteerd, is het nooit ontslagen. Wanneer ik ze handmatig instel in de uitgebreide controles van de emulator, werkte het zoals verwacht.


Antwoord 19

Ik heb deze fout opgelost. Je hoeft alleen Layout Manager toe te voegen
en voeg de lege adapter toe.

Zoals deze 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
//}

Antwoord 20

In mijn layout xml-bestand ontbrak de onderste regel met layoutManager. De fout verdween nadat ik deze had toegevoegd.

  <androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view_chat"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    app:layoutManager="LinearLayoutManager"/>

Antwoord 21

In mijn situatie was het een vergeten component die zich in de ViewHolder-klasse bevond, maar niet in het lay-outbestand


Antwoord 22

Ik had hetzelfde probleem en realiseerde me dat ik zowel de LayoutManager als de adapteraan het instellen was nadat ik de gegevens van mijn bron had opgehaald in plaats van de twee in de onCreatemethode.

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

Vervolgens de adapter op de hoogte gebracht van gegevenswijziging

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

Antwoord 23

Dit probleem is omdat u geen LayoutManagertoevoegt voor uw RecyclerView.

Een andere reden is dat je deze code aanroept in een NonUIThread. Zorg ervoor dat je deze oproep in de UIT-thread belt.

De oplossing is dat u alleen een LayoutManagervoor de RecyclerViewhoeft toe te voegen voordat u setAdapterin de UI-thread gebruikt.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

Antwoord 24

Mijn probleem was dat mijn weergave van de recycler er zo uitzag

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

Toen het er zo uit had moeten zien

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

Antwoord 25

Maak in uw RecyclerViewadapterklasse, bijvoorbeeld MyRecyclerViewAdapter, een constructor met de volgende parameters.

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

mDatazijn de gegevens die u doorgeeft aan de adapter. Het is optioneel als u geen gegevens hoeft door te geven.
mInflateris het LayoutInflater-object dat u hebt gemaakt en dat u gebruikt in de functie OnCreateViewHoldervan de adapter.

Hierna bevestigt u de adapter in de MainActivity of waar u maar wilt op de hoofd-/UI-thread, zoals

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

Antwoord 26

Opgelost door de geïnitialiseerde lege lijst en adapter onderaan in te stellen en notificatieDataSetChanged aan te roepen wanneer de resultaten worden opgehaald.

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

Antwoord 27

Ik heb 16 minuten van mijn leven verloren met dit probleem, dus ik geef deze ongelooflijk gênante fout toe die ik maakte: ik gebruik Butterknife en ik bind de weergave in onCreateView in dit fragment.

Het kostte veel tijd om erachter te komen waarom ik geen layoutmanager had – maar het is duidelijk dat de views worden geïnjecteerd zodat ze niet echt nul zijn, dus de recycler zal nooit nul zijn .. oeps!

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

Als u een probleem als dit krijgt, volgt u uw weergave en gebruikt u iets als uiautomatorviewer


Antwoord 28

In mijn geval gebeurde het omdat ik een RecyclerView in een LinearLayout had ingesloten.

Ik had eerder een lay-outbestand met slechts één root RecyclerView als volgt

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

Ik denk dat het probleem zich binnen de drie gescheiden regels bevindt. Hoe dan ook, ik denk dat het een eenvoudig probleem is, ik zal er morgen aan werken; dacht dat ik moest schrijven wat ik vond voordat ik deze thread vergat.


Antwoord 29

Voeg het volgende toe aan RecyclerView

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

Voorbeeld:

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

Antwoord 30

Nog een antwoord toegevoegd sinds ik deze thread tegenkwam toen ik de fout googelde. Ik probeerde een PreferenceFragmentCompatte initialiseren, maar ik vergat de voorkeur-XML in onCreatePreferencesals volgt op te blazen:

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

De fout was een mysterie totdat ik me realiseerde dat PreferenceFragmentCompatintern een RecyclerViewmoet gebruiken.

Other episodes