Ich habe gerade Recyclerview in meinen Code implementiert, der Listview ersetzt.
alles funktioniert gut Die Objekte werden angezeigt.
aber logcat sagt
15: 25: 53.476 E/RecyclerView ﹕ Es ist kein Adapter angeschlossen. Layout überspringen
15: 25: 53.655 E/RecyclerView ﹕ Es ist kein Adapter angeschlossen. Layout überspringen
für den Code
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Wie Sie sehen, habe ich einen Adapter für Recycleview . Angeschlossen. Warum erhalte ich diesen Fehler weiterhin?
ich habe andere Fragen gelesen, die sich auf dasselbe Problem beziehen, aber keine hilft.
Können Sie sicherstellen, dass Sie diese Anweisungen aus dem "main" -Thread aufrufen (z. B. innerhalb der onCreate()
-Methode) . Sobald ich dieselben Anweisungen aus einer "delayed" -Methode aufrufe. In meinem Fall a ResultCallback
erhalte ich dieselbe Nachricht.
In meiner Fragment
wird beim Aufrufen des Codes unten in einer ResultCallback
-Methode dieselbe Nachricht ausgegeben. Nachdem der Code in meiner App auf die onConnected()
-Methode verschoben wurde, war die Nachricht weg ...
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Ich habe die gleichen zwei Fehlermeldungen erhalten, bis ich zwei Dinge in meinem Code behoben habe:
(1) Standardmäßig werden beim Implementieren von Methoden in RecyclerView.Adapter
Folgendes generiert:
@Override
public int getItemCount() {
return 0;
}
Stellen Sie sicher, dass Sie Ihren Code so aktualisieren, dass Folgendes angezeigt wird:
@Override
public int getItemCount() {
return artists.size();
}
Offensichtlich werden, wenn Sie null Elemente in Ihren Artikeln haben, null Dinge auf dem Bildschirm angezeigt.
(2) Ich habe dies nicht wie in der obersten Antwort gezeigt: CardView layout_width = "match_parent" passt nicht zur übergeordneten RecyclerView-Breite
//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) BEARBEITEN: BONUS: Stellen Sie außerdem sicher, dass Sie Ihre RecyclerView
wie folgt einrichten:
<Android.support.v7.widget.RecyclerView
Android:id="@+id/RecyclerView"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
/>
So nicht:
<view
Android:id="@+id/RecyclerView"
class="Android.support.v7.widget.RecyclerView"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
Ich habe einige Tutorials mit letzterer Methode gesehen. Während es funktioniert, denke ich, dass es auch diesen Fehler erzeugt.
Ich habe die gleiche Situation wie Sie, die Anzeige ist in Ordnung, aber in locat ..__ wird ein Fehler angezeigt.
RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);
(2) Rufen Sie notifyDataStateChanged auf, wenn Sie die Daten abrufen
adapter.notifyDataStateChanged();
Im Quellcode der RecyclerView gibt es einen anderen Thread, um den Status der Daten zu überprüfen.
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 dispatchLayout () können wir feststellen, dass der Fehler darin enthalten ist:
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 {
1) Erstelle ViewHolder , der nichts bewirkt :)
// SampleHolder.Java
public class SampleHolder extends RecyclerView.ViewHolder {
public SampleHolder(View itemView) {
super(itemView);
}
}
2) Erstellen Sie erneut RecyclerView , was nichts bewirkt :)
// 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) Wenn Ihr echter Recycler jetzt nicht bereit ist, verwenden Sie einfach das Beispiel wie unten beschrieben.
RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id);
myRecycler.setLayoutManager(new LinearLayoutManager(this));
myRecycler.setAdapter(new SampleRecycler());
Dies ist zwar nicht die beste Lösung, aber es funktioniert! Hoffe das ist hilfreich.
ich habe dieses Problem, ein paar Zeitprobleme ist recycleView in ScrollView object
Nach der Überprüfung der Implementierung scheint der Grund folgender zu sein. Wenn RecyclerView in eine ScrollView eingefügt wird, ist während des Messschritts die Höhe nicht angegeben (da ScrollView eine beliebige Höhe zulässt) und als Ergebnis die Mindesthöhe (laut Implementierung) erreicht, die anscheinend Null ist.
Sie haben mehrere Möglichkeiten, dies zu beheben:
(Kann auch für Android.support.v4.widget.NestedScrollView
verfolgt werden)
Dies geschieht, wenn Sie den Adapter während der Erstellungsphase nicht einstellen:
@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);
....
}
Verschieben Sie einfach den Adapter in onCreate mit leeren Daten und wenn Sie den Datenanruf haben:
mAdapter.notifyDataSetChanged();
Stellen Sie sicher, dass Sie den Layout-Manager für Ihre RecyclerView wie folgt festgelegt haben:
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
Anstelle von LinearLayoutManager
können Sie auch other layout manager verwenden.
Dies ist darauf zurückzuführen, dass sich das tatsächlich aufgeblasene Layout von dem unterscheidet, das Sie beim Auffinden der RecyclerView angegeben haben. Wenn Sie das Fragment erstellen, wird die onCreateView-Methode standardmäßig wie folgt angezeigt: return inflater.inflate(R.layout.<related layout>,container.false);
Erstellen Sie stattdessen die Ansicht separat und verwenden Sie diese, um auf recycelte Ansicht zu verweisenView view= inflater.inflate(R.layout.<related layout>,container.false);
recyclerview=view.findViewById(R.id.<recyclerView ID>);
return view;
Ich hatte den gleichen Fehler. Ich habe das Problem behoben, wenn Sie auf Daten wie mich warten, die Retrofit oder ähnliches verwenden
Vor Oncreate setzen
private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;
Setzen Sie sie in Ihren 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);
Wenn Sie Daten erhalten, setzen Sie
adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);
Gehen Sie nun in Ihre ArtistArrayAdapter-Klasse und tun Sie dies wie folgt: Wenn Ihr Array leer oder leer ist, wird GetItemCount 0 zurückgeben, wenn dies nicht die Größe des Artists-Arrays ist
@Override
public int getItemCount() {
int a ;
if(artists != null && !artists.isEmpty()) {
a = artists.size();
}
else {
a = 0;
}
return a;
}
Prüfen Sie, ob Sie diese Methode in Ihrem Adapter nicht aufgerufen haben
@Override
public int getItemCount() {
return list.size();
}
Diese Zeilen müssen in OnCreate
sein:
mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
Ersetzen Sie einfach den obigen Code durch diesen und es sollte funktionieren. Was Sie falsch gemacht haben, ist der Aufruf von setAdapter (adapter), bevor Sie den Layout Manager aufrufen.
Ich habe diesen Fehler behoben. Sie müssen lediglich den Layout-Manager Hinzufügen und den leeren Adapter hinzufügen.
Wie dieser 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
//}
Dies ist wirklich ein einfacher Fehler, den Sie erhalten, da hier keine Codes erforderlich sind .Dieser Fehler tritt aufgrund der falschen Layoutdatei auf, die von der Aktivität verwendet wird. Mit IDE habe ich automatisch ein Layout v21 eines Layouts erstellt, das zum Standardlayout der Aktivität wurde. Alle Codes, die ich in der alten und der neuen Layoutdatei verwendet habe, hatten nur wenige XML-Codes, was zu diesem Fehler führte.
Lösung: Kopieren Sie alle Codes des alten Layouts und fügen Sie sie in Layout V 21 ein.
In meinem Fall habe ich den Adapter in onLocationChanged()
callback UND das Debugging im Emulator eingestellt. Da es keine Standortänderung erkannt hat, hat es nie ausgelöst. Wenn ich sie manuell in den erweiterten Steuerelementen des Emulators einstelle, funktionierte das wie erwartet.
Initialisieren Sie zunächst den 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);
}
Rufen Sie bei Änderungen des Datensatzes einfach die updateComments-Methode auf.
Ich hatte das gleiche Problem und stellte fest, dass ich sowohl den LayoutManage r als auch den Adapter nach dem Abrufen der Daten von meiner Quelle einrichtete, anstatt die beiden in der onCreate - Methode festzulegen.
salesAdapter = new SalesAdapter(this,ordersList);
salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
salesView.setAdapter(salesAdapter);
Dann wurde der Adapter über die Datenänderung benachrichtigt
//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();
}
Ich habe 16 Minuten meines Lebens mit diesem Problem verloren, also gebe ich einfach diesen unglaublich peinlichen Fehler zu, den ich gemacht habe - ich benutze Butterknife und binde die Ansicht in onCreateView in diesem Fragment.
Es dauerte lange, bis ich herausfand, warum ich keinen Layoutmanager hatte - aber die Ansichten werden eingeblendet, damit sie nicht wirklich null sind. Der Recycler wird also niemals null sein.
@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));
}
Wenn Sie ein Problem wie dieses erhalten, verfolgen Sie Ihre Ansicht und verwenden Sie etwas wie uiautomatorviewer
Für diejenigen, die RecyclerView
innerhalb eines verwenden fragment und pumpen Sie es aus anderen Ansichten auf: Wenn Sie die gesamte Fragmentansicht aufblasen, stellen Sie sicher, dass Sie RecyclerView
an seine Stammansicht binden.
Ich habe die Verbindung hergestellt und alles richtig gemacht, aber ich habe die Bindung nie gemacht. Diese Antwort von @Prateek Agarwal hat alles für mich, aber hier ist mehr Ausarbeitung.
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);
// rest ...
return rootView;
}
Erstellen Sie in Ihrer RecyclerView
-Adapterklasse beispielsweise MyRecyclerViewAdapter
einen Konstruktor mit den folgenden Parametern.
MyRecyclerViewAdapter(Context context, List<String> data) {
this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
this.mData = data;
}
mData
sind die Daten, die Sie an den Adapter übergeben. Es ist optional, wenn keine zu übergebenden Daten vorhanden sind .____mInflater
ist das von Ihnen erstellte Objekt LayoutInflater
, das Sie in der Funktion OnCreateViewHolder
des Adapters verwenden.
Danach befestigst du den Adapter in der MainActivity oder wo auch immer du willst auf dem Main/UI-Thread richtig
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);
}
....
Mein Problem war, dass mein Recycler so aussah
<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>
Wann hätte es so aussehen sollen
<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>
Keine große Antwort, aber ich hatte das gleiche Problem, auch wenn der Code korrekt war. Manchmal ist es einfach die einfachste Marke. In diesem Fall kann der Fehler des OP auch <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
aus dem Manifest fehlen, wodurch der gleiche Fehler reproduziert wird.
Fügen Sie einfach Folgendes zu RecyclerView
hinzu.
app:layoutManager="Android.support.v7.widget.LinearLayoutManager"
Beispiel:
<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>
In meinem Fall ist es passiert, weil ich eine RecyclerView in ein LinearLayout eingebettet habe.
Ich hatte zuvor eine Layout-Datei, die nur einen RecyclerView-Stamm wie folgt enthielt
<?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"/>
Ich glaube, das Problem ist innerhalb der 3 Zeilen getrennt. Jedenfalls denke ich, dass es ein einfaches Problem ist. Ich werde morgen daran arbeiten. Ich dachte, ich sollte schreiben, was ich gefunden habe, bevor ich diesen Thread vergessen habe.
// Es passiert, wenn Sie den Adapter während der Erstellungsphase nicht einstellen: Rufen Sie notifyDataSetChanged () auf, wenn die API-Antwort Its Working erhält
@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();
In meiner Situation war es eine vergessene Komponente, die in der ViewHolder-Klasse lokalisiert wurde, aber nicht in der Layoutdatei
Dieses Problem tritt auf, weil Sie keine LayoutManager
für Ihre RecyclerView
hinzufügen.
Ein weiterer Grund ist, dass Sie diesen Code in einem NonUIThread aufrufen. Stellen Sie sicher, dass Sie diesen Aufruf im UIThread aufrufen.
Die Lösung besteht nur darin, dass Sie eine LayoutManager
für die RecyclerView
vor Ihnen setAdapter
im UI-Thread hinzufügen müssen.
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Wird gelöst, indem die initialisierte leere Liste und der Adapter am unteren Rand festgelegt und notifyDataSetChanged aufgerufen werden, wenn Ergebnisse abgerufen werden.
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
recyclerviewItems.setLayoutManager(linearLayoutManager);
someAdapter = new SomeAdapter(getContext(),feedList);
recyclerviewItems.setAdapter(someAdapter);
Ich habe noch eine weitere Antwort hinzugefügt, seit ich auf diesen Thread gestoßen bin und den Fehler gegoogelt habe. Ich habe versucht, eine PreferenceFragmentCompat
zu initialisieren, habe aber vergessen, die Präferenz-XML in onCreatePreferences
wie folgt aufzublähen:
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)
}
}
Der Fehler war ein Rätsel, bis ich erkannte, dass PreferenceFragmentCompat
intern eine RecyclerView
verwenden muss.