recyclerview Kein Adapter angeschlossen; Layout überspringen

241

Nur RecyclerViewin meinem Code implementiert , ersetzen ListView.

Alles funktioniert gut. Die Daten werden angezeigt.

Es werden jedoch Fehlermeldungen protokolliert:

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

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

für den folgenden 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 angeschlossen RecyclerView. Warum erhalte ich diesen Fehler immer wieder?

Ich habe andere Fragen zum selben Problem gelesen, aber keine davon hilft.

Equitharn
quelle
sind Künstler leer? Was passiert, wenn Sie setAdapter und setLayoutManager wechseln?
Blackbelt
Sie müssen einen RecyclerView.Adapter
Octopus38
12
Möglicherweise wird es angezeigt, wenn Sie recyclerview nicht initialisieren, sobald es an das Fenster angehängt ist.
Yigit
1
@yigit Ich warte auf die Nachrüstung, um Daten herunterzuladen und nachdem sie fertig sind, wird der angegebene Code ausgeführt!
Equitharn
3
Wie schwerwiegend ist dieser Fehler? Kann das ignoriert werden? Wie auch immer, ich benutze setAdapter (null), um den Fehler zu vermeiden.
Priyankvex

Antworten:

243

Können Sie sicherstellen, dass Sie diese Anweisungen aus dem "Haupt" -Thread aufrufen (z. B. innerhalb der onCreate()Methode)? Sobald ich die gleichen Anweisungen aus einer "verzögerten" Methode aufrufe. In meinem Fall a ResultCallbackerhalte ich die gleiche Nachricht.

In meinem FragmentFall ResultCallbackerzeugt das Aufrufen des folgenden Codes innerhalb einer Methode dieselbe Nachricht. Nachdem onConnected()ich den Code in die Methode in meiner App verschoben hatte, war die Nachricht verschwunden ...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Peter
quelle
9
Aber ich muss zuerst die Daten herunterladen und dann anzeigen!
Equitharn
93
Setzen Sie einfach zuerst einen leeren Adapter ein und aktualisieren Sie ihn, sobald Sie die Daten haben (das funktioniert bei mir).
Peter
3
Das hat Yigit vorgeschlagen!
Equitharn
13
@equitharn Sie sollten zuerst einen leeren Adapter festlegen und dann die Daten herunterladen. Rufen Sie mAdapter.notifyDataSetChanged () auf, das für mich funktioniert.
DomonLee
2
Diese Lösung hilft mir nicht. Tatsächlich hilft mir keine Lösung in diesem Thread. Kann jemand bitte meinen Fall hier untersuchen
Pulak
41

Ich habe die gleichen zwei Fehlermeldungen erhalten, bis ich zwei Dinge in meinem Code behoben habe:

(1) Wenn Sie Methoden implementieren, wird standardmäßig Folgendes RecyclerView.Adaptergeneriert:

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

Stellen Sie sicher, dass Sie Ihren Code so aktualisieren, dass er lautet:

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

Wenn Ihre Artikel keine Elemente enthalten, werden auf dem Bildschirm natürlich keine Elemente angezeigt.

(2) Ich habe dies nicht wie in der oberen Antwort gezeigt getan : CardView layout_width = "match_parent" stimmt nicht mit der übergeordneten RecyclerView-Breite überein

//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 Folgendes einrichten RecyclerView:

<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 der letzteren Methode gesehen. Während es funktioniert, denke ich, dass es auch diesen Fehler erzeugt.

Mikro
quelle
1
Mein getItemCount () sieht so aus public int getItemCount() { return artists == null ? 0 : artists.size(); }und der LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
Equitharn
das funktioniert bei mir: @Override public int getItemCount () {return artist.size (); }
AstonCheah
4
Oh Gott. In dem Moment, in dem Sie zu SO zurückkehren und eine Antwort sehen, die Sie bereits positiv bewertet haben, und feststellen, dass Sie dasselbe Dumme getan haben. Nochmals vielen Dank @Micro.
Androidevil
20

Ich habe die gleiche Situation mit Ihnen, Anzeige ist in Ordnung, aber Fehler im locat erscheinen. Das ist meine Lösung: (1) Initialisieren Sie den RecyclerView & Bind-Adapter ON CREATE ()

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

(2) Rufen Sie notifyDataStateChanged auf, wenn Sie die Daten erhalten

adapter.notifyDataStateChanged();

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

            }
        }
    };

Im dispatchLayout () finden wir den Fehler darin:

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

Ich habe dieses Problem, ein paar Zeit Problem ist recycleView in ScrollView Objekt gesetzt

Nach Überprüfung der Implementierung scheint der Grund der folgende zu sein. Wenn RecyclerView in eine ScrollView eingefügt wird, ist die Höhe während des Messschritts nicht angegeben (da ScrollView eine beliebige Höhe zulässt) und entspricht infolgedessen der Mindesthöhe (gemäß Implementierung), die anscheinend Null ist.

Sie haben mehrere Möglichkeiten, dies zu beheben:

  1. Stellen Sie eine bestimmte Höhe auf RecyclerView ein
  2. Setzen Sie ScrollView.fillViewport auf true
  3. Oder halten Sie RecyclerView außerhalb von ScrollView. Meiner Meinung nach ist dies bei weitem die beste Option. Wenn die Höhe von RecyclerView nicht begrenzt ist - was beim Einfügen in ScrollView der Fall ist -, haben alle Ansichten des Adapters genügend vertikalen Platz und werden auf einmal erstellt. Es gibt kein View-Recycling mehr, was den Zweck von RecyclerView irgendwie verletzt.

(Kann auch befolgt werden android.support.v4.widget.NestedScrollView)

FxRi4
quelle
Das Setzen von ScrollView.fillViewport auf true löste mein Problem, danke ein paar
Eman
10

1) Erstellen Sie einen ViewHolder , der nichts tut :)

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

2) Erstellen Sie erneut RecyclerView , das nichts tut :)

// 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 noch nicht fertig ist, verwenden Sie einfach das folgende Beispiel.

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.

Madan Sapkota
quelle
Hallo, bitte habe ich den gleichen Fehler und ich weiß nicht, wo ich prüfen soll, ob der Recycler nicht bereit ist, einen leeren Adapter zu übergeben) und wo ich überprüfen kann, ob der Recycler bereit ist (um den Adapter mit Daten zu übergeben)
James
Das ist großartig, hier ist ein Drag'n-Drop-Stil gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
nmu
9

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

Bewegen Sie den Adapter einfach mit leeren Daten in onCreate und wenn Sie den Datenaufruf haben:

mAdapter.notifyDataSetChanged();
Peter File
quelle
Stellen Sie sicher, dass Sie Daten im Customadapter-Konstruktor innerhalb der onCreate-Methode festlegen
Mohit Singh
4

Überprüfen Sie, ob Sie diese Methode in Ihrem Adapter nicht aufgerufen haben

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

Stellen Sie sicher, dass Sie den Layout-Manager für Ihre RecyclerView wie folgt festlegen:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

Stattdessen LinearLayoutManagerkönnen Sie auch andere Layout-Manager verwenden.

Sumit Jha
quelle
3

Ich hatte den gleichen Fehler, den ich behoben habe, wenn Sie darauf warten, dass Daten wie ich nachgerüstet werden oder ähnliches

Vor Oncreate stellen

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

Legen Sie sie in Ihr 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, wenn Ihr Array leer oder null ist. GetItemCount gibt 0 zurück, wenn nicht, hat es die Größe des Künstler-Arrays

@Override
public int getItemCount() {

    int a ;

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

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}
user3277530
quelle
3

Diese Zeilen müssen in OnCreate:

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

Dies liegt daran, dass sich das tatsächlich aufgeblasene Layout von dem unterscheidet, auf das Sie beim Auffinden der recyclerView verwiesen haben. Standardmäßig wird beim Erstellen des Fragments die onCreateView-Methode wie folgt angezeigt: return inflater.inflate(R.layout.<related layout>,container.false);

Erstellen Sie stattdessen die Ansicht separat und verwenden Sie diese, um auf recyclerView zu verweisen View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;

Prateek Agarwal
quelle
2

Initialisieren Sie zuerst 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);
}

Wenn sich der Datensatz ändert, rufen Sie einfach die updateComments-Methode auf.

Roger
quelle
2

Für diejenigen, die das RecyclerViewinnerhalb eines Fragments verwenden und es aus anderen Ansichten aufblasen: Wenn Sie die gesamte Fragmentansicht aufblasen, stellen Sie sicher, dass Sie das RecyclerViewan die Stammansicht binden .

Ich habe alles für den Adapter richtig angeschlossen und 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);
    return rootView;
}
N. Osil
quelle
1
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, dass Sie setAdapter (Adapter) aufgerufen haben, bevor Sie den Layout-Manager aufgerufen haben.

Pradeep Bogati
quelle
1

Dies ist wirklich ein einfacher Fehler, den Sie erhalten, da Sie hier keine Codes ausführen müssen. Dieser Fehler tritt aufgrund der falschen Layoutdatei auf, die von der Aktivität verwendet wird. Mit der 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 neuen Layoutdatei gemacht 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

Vikash Sharma
quelle
1

In meinem Fall habe ich den Adapter in onLocationChanged()Callback UND Debugging im Emulator eingestellt. Da es keinen Standortwechsel feststellte, wurde es nie ausgelöst. Wenn ich sie manuell in den erweiterten Steuerelementen des Emulators einstellte, funktionierte es wie erwartet.

Saiyancoder
quelle
1

Ich habe diesen Fehler behoben. Sie müssen nur 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
//}
mehdi janbarari
quelle
1
Ich mache es für Anfänger Benutzer
Mehdi Janbarari
1

Fügen Sie einfach Folgendes hinzu RecyclerView

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>
Alan Deep
quelle
1

Ich hatte diesen Fehler und versuchte eine Weile, ihn zu beheben, bis ich die Lösung fand.

Ich habe eine private Methode buildRecyclerView erstellt und sie zweimal aufgerufen, zuerst in onCreateView und dann nach meinem Rückruf (in dem ich Daten von einer API abrufe). Dies ist meine Methode buildRecyclerView in meinem 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);
}

Außerdem muss ich die Methode get-Item-Count in meinem Adapter ändern, da On-Create-View die Liste null ist und einen Fehler verursacht. Mein get-Item-Count ist also der folgende:

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

    }
Zeke
quelle
0

In meiner Situation war es eine vergessene Komponente, die sich in der ViewHolder-Klasse befindet, aber nicht in der Layoutdatei

lomec
quelle
0

Ich hatte das gleiche Problem und stellte fest, dass ich sowohl das LayoutManage r als auch den Adapter nach dem Abrufen der Daten aus meiner Quelle festlegte , anstatt die beiden in der onCreate- Methode festzulegen .

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

Benachrichtigen Sie dann den Adapter über Datenänderungen

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

Dieses Problem liegt daran, dass Sie keine LayoutManagerfür Ihre hinzufügen RecyclerView.

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 ein LayoutManagerfür das RecyclerViewvor Ihnen setAdapterim UI-Thread hinzufügen müssen .

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Khalid Taha
quelle
Wenn Sie die Einstellung von LayoutManager verzögern müssen, sollten Sie dies über Ihre Rückrufmethode tun: recyclerView.post (() -> {recyclerView.setLayoutManager (mGridLayoutManager); recyclerView.addItemDecoration (new ItemOffsetDecoration (itemGap));});
ievgen
0

Mein Problem war, dass meine Recycling-Ansicht 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 es so hätte 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>
Kingsley Mitchell
quelle
0

Erstellen Sie in Ihrer RecyclerViewAdapterklasse beispielsweise MyRecyclerViewAdaptereinen 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;
}

mDatasind die Daten, die Sie an den Adapter übergeben. Es ist optional, wenn Sie keine Daten übergeben müssen. mInflaterist das LayoutInflaterObjekt, das Sie erstellt haben und das Sie in der OnCreateViewHolderFunktion des Adapters verwenden.

Danach befestigen Sie den Adapter in der MainActivity oder wo immer Sie möchten, auf dem Haupt- / UI-Thread richtig wie

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

Behebung durch Festlegen der initialisierten leeren Liste und des Adapters unten und Aufrufen von notifyDataSetChanged beim Abrufen der Ergebnisse.

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

Ich habe 16 Minuten meines Lebens mit diesem Problem verloren, daher gebe ich diesen unglaublich peinlichen Fehler zu, den ich gemacht habe. Ich verwende Butterknife und binde die Ansicht in onCreateView in diesem Fragment.

Es hat lange gedauert, um herauszufinden, warum ich keinen Layoutmanager hatte - aber offensichtlich werden die Ansichten eingefügt, damit sie nicht wirklich null sind, sodass der Recycler niemals null sein wird. Hoppla!

@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 so etwas wie uiautomatorviewer

Saik Caskey
quelle
0

Keine gute 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 OP-Fehler auch <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />im Manifest fehlen , das denselben Fehler reproduziert.

SpicyWeenie
quelle
0

In meinem Fall ist es passiert, weil ich eine RecyclerView in ein LinearLayout eingebettet habe.

Ich hatte zuvor eine Layoutdatei, die nur eine Root-RecyclerView enthielt, wie folgt

<?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 liegt innerhalb der 3 getrennten Zeilen. Wie auch immer, ich denke, es ist ein einfaches Problem, ich werde morgen daran arbeiten. Ich dachte, ich sollte schreiben, was ich gefunden habe, bevor ich diesen Thread vergesse.

SoliQuiD
quelle
0

Hinzufügen einer weiteren Antwort, seit ich auf diesen Thread gestoßen bin, der den Fehler googelt. Ich habe versucht, a zu initialisieren, PreferenceFragmentCompataber ich habe vergessen, die XML-Voreinstellung onCreatePreferenceswie folgt aufzublasen :

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 mir klar wurde, dass PreferenceFragmentCompatein RecyclerViewintern verwendet werden muss.

aschmied
quelle
0

// Es passiert , wenn Sie nicht den Adapter während der Erstellungsphase Einstellung: Aufruf notifyDataSetChanged () , wenn api Antwort bekommt seinen Arbeits

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