Ik heb zojuist RecyclerView
in 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 RecyclerView
aangesloten.
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 Fragment
levert 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.Adapter
genereert:
@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 RecyclerView
als 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:
- Stel een bepaalde hoogte in op recycerview
- Set ScrollView.FillViewPoort naar TRUE
- 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.NestedScrollView
Ook)
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 LinearLayoutManager
kunt 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 OnCreate
staan:
mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
Antwoord 12
Voor degenen die de RecyclerView
binnen een fragmentgebruiken en het vanuit andere weergaven opblazen: zorg er bij het opblazen van de hele fragmentweergave voor dat u de RecyclerView
naar de hoofdweergave.
Ik maakte verbinding en deed alles voor de adapter correct, maar ik heb de binding nooit gedaan.
Deze antwoord door @Prateek Agarwal i>heeft het allemaal voor mij, maar hier is meer uitwerking.
KOTLIN b>
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 b>
@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 LayoutManager
toevoegt 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 LayoutManager
voor de RecyclerView
hoeft toe te voegen voordat u setAdapter
in 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 RecyclerView
adapterklasse, 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;
}
mData
zijn de gegevens die u doorgeeft aan de adapter. Het is optioneel als u geen gegevens hoeft door te geven.
mInflater
is het LayoutInflater
-object dat u hebt gemaakt en dat u gebruikt in de functie OnCreateViewHolder
van 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 PreferenceFragmentCompat
te initialiseren, maar ik vergat de voorkeur-XML in onCreatePreferences
als 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 PreferenceFragmentCompat
intern een RecyclerView
moet gebruiken.