wake-up-neo.com

RecyclerView ruft nicht onCreateViewHolder oder onBindView auf

Es werden keine Fehler angezeigt und alle Daten scheinen gültig zu sein. Aus irgendeinem Grund wird keine der View-bezogenen Methoden aufgerufen. Ich habe folgendes sichergestellt:

  • getItemCount () ist die einzige aufgerufene Adaptermethode, die einen positiven Integer-Wert zurückgibt.

    • Konstruktor wird aufgerufen, Membervariablen sind gültig.

    • Die übergeordnete Ansicht ist ein vertikales LinearLayout. Keine Bildlaufansicht oder eine andere Ansicht mit eigenen Bildlaufeigenschaften in Sicht.

    • die Fragmentansicht wird erstellt und auf dem Bildschirm angezeigt.

Hier ist die Deklaration im Fragment, gefolgt vom Adapter. Jede Hilfe wäre dankbar, da dies völlig verblüfft ist.

SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
private static final String TAG = String.format("==> %S", SubMenuAdapter.class.getSimpleName());

private final List<ContentItem> mContentItems;
private Context mContext;

public SubMenuAdapter(Context context, List<ContentItem> contenItems) {
    Log.d(TAG, "Constructor called");
    mContentItems = contenItems;
    mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder called");
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_resource_efficiency, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder called");

    ContentItem item = mContentItems.get(position);
    holder.textName.setText(item.getName());
    FontSetter.setMyriadProRegular(mContext, holder.textName);
    Picasso.with(mContext).load("file://" + item.getPreviewImageDefault()).into(holder.imageIcon);
}

@Override
public int getItemCount() {
    Log.d(mContext, String.format("getItemCount: %d", mContentItems.size()));
    return mContentItems.size();
}

// ViewHolder
public static class ViewHolder extends RecyclerView.ViewHolder {

    TextView textName;
    ImageView imageIcon;

    public ViewHolder(View view) {
        super(view);
        textName = (TextView) view.findViewById(R.id.tv_resource_efficiency_option);
        imageIcon = (ImageView) view.findViewById(R.id.iv_resource_efficiency_icon);
    }
}
47
Conti

Dies kann auch jemandem helfen

Erste Benutzung

recyclerView.setAdapter(adapter);

Und dann:

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

So wird es so aussehen:

recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

Die Bestellung wird storniert

74
Aerim

Ich habe seit über einer Stunde die Antwort gesucht. 

Vergessen Sie nicht, diesen einen Liner anzurufen, bevor Sie Ihren Adapter einstellen.

recyclerView.setLayoutManager(new LinearLayoutManager(this));

Es scheint, dass die Recycler-Ansicht nicht über eine standardmäßige Layout-Manager-Option verfügt, sodass wir sie programmgesteuert hinzufügen müssen.

Prost, wenn Sie es hilfreich fanden.

26
ralphgabb

Stellen Sie sicher, dass die Recycling-Ansicht nicht von nestedscrollview untergeordnet ist

dieser Code funktioniert beispielsweise nicht. 

<Android.support.v4.widget.NestedScrollView
    Android:id="@+id/responder_scroll"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@color/darkGray"
    Android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.CardView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginTop="24dp"
            app:cardElevation="@dimen/spacing_medium"
            app:cardUseCompatPadding="true">

            <RelativeLayout
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content">

                <TextView
                    Android:id="@+id/responder_testimonial"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentTop="true"
                    Android:text="Testimonial"
                    Android:textSize="@dimen/general_font_size" />

                <TextView
                    Android:id="@+id/responder_counter_testimonial"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_toRightOf="@+id/responder_testimonial"
                    Android:text="170"
                    Android:textSize="@dimen/general_font_size_small" />

                <Button
                    Android:id="@+id/responder_btn_testimonial"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentRight="true"
                    Android:layout_alignParentTop="true"
                    Android:text="Go" />

               <view
                    Android:id="@+id/responder_list_testimonial"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:layout_below="@+id/responder_testimonial"
                    class="Android.support.v7.widget.RecyclerView"/>
            </RelativeLayout>
        </Android.support.v7.widget.CardView>

    </FrameLayout>
</Android.support.v4.widget.NestedScrollView>

dann benutze ich

<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">

<view
    Android:id="@+id/responder_list_testimonial"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_below="@+id/responder_testimonial"
    class="Android.support.v7.widget.RecyclerView"/>

19
raditya gumay

Ich weiß nicht, ob dies für jedermann hilfreich sein wird, aber ich hatte fast das gleiche genaue Problem ... Mein Problem lag weder im Fragment/Class noch im Recycler-Adapter. Das Problem bestand im übergeordneten XML-Layout, bei dem die Aktionsleiste match_parent verwendet hat, bei der die FrameLayout -in dem Fragment ersetzt wurde - keine verfügbare Stelle zum Anzeigen angezeigt wurde. Deshalb wurden die Methoden nicht aufgerufen.

Ich denke, ähnliche Szenarien könnten für diejenigen zutreffen, die das gleiche Problem haben. Überprüfen Sie jede Breite und Höhe in jeder XML-Datei doppelt in demselben Baum, da das Problem anscheinend überhaupt nicht im Adapter liegt.

11

Meine zwei Pfennige hier. Ich habe gerade mehr als drei Stunden damit verbracht, dieses Problem zu beheben.

Stellen Sie sicher, dass Sie die folgende Leitung nicht achtlos benutzt haben.

recyclerView.setHasFixedSize(true);

Legen Sie die feste Größe nur fest, wenn Sie sicher sind, dass die Ansicht eine konstante Größe hat. Wenn dies nicht der Fall ist, werden die Methoden onCreateViewHolder und onBindView möglicherweise überhaupt nicht aufgerufen.

7

Ich hatte auch das gleiche Problem, wo onCreateViewHolder oder onBindView Methode nicht aufgerufen wurde, nur getItemCount wurde aufgerufen. Im Grunde war es ein Problem mit der Höhe und dem Gewicht von RecyclerView, das auf wrap_content oder 0dp eingestellt war. Nachdem der Wert auf einen bestimmten Wert geändert wurde, wurde das Problem behoben.

4
Vijay Pal

Das ist schon sehr alt, aber in meinem Fall habe ich eine ConstraintLayout verwendet und die Höhe war falsch eingestellt, so dass meine Ansicht 0dp hatte und der Adapter dann speichern würde, um seine Arbeit zu erledigen, da die Ansicht 0dp ist.

Stellen Sie sicher, dass Höhe und Breite in Ordnung sind und RecyclerView eine positive Größe hat.

2

Wenn Sie wrap_content sowohl als Höhe Ihrer Liste als auch als Höhe Ihrer Artikelliste angeben, wird nichts angezeigt und keine Ihrer RecyclerView-Funktionen aufgerufen.

2
Meriam

In meinem Fall wurde setHasStableIds (true) verwendet. in dem Adapter, während einige Listenelemente -1 in getItemID () zurückgegeben haben, denke ich, dass RecyclerView der Meinung war, dass sie gleich sind.

1
David

Ich weiß, dass dieses Thema alt ist, aber wenn Sie den gleichen Lernfehler gemacht haben wie ich, könnten Sie dieses hilfreich finden.

Als ich auf einer Website über RecyclerView studierte und Code kopierte und sich an meinen Kontext anpasste, habe ich verschiedene Variablen (z. B. Benutzer und Daten) erstellt, die dasselbe tun sollten, mit der Ausnahme, dass einige Methoden Daten aufrufen und andere Benutzer aufrufen . Dies ist ein einfacher Fehler, wenn Sie versuchen, den Code und die Java-Funktionalität von anderen zu verstehen (das passiert mir immer wieder). 

Es ist gut zu wissen, dass Sie in Ihrer Konsole an beliebiger Stelle in Ihrem Java-Code drucken können, so dass Sie dieses Problem ganz leicht debuggen können. 

Viel Glück!

1
bemihai22

Wenn Sie FirebaseListAdapter implementieren, müssen Sie die folgenden Punkte beachten, um es korrekt einzurichten.

  1. Überprüfen Sie, ob recyclerview in xml alle Attribute korrekt hat. Verwenden Sie beispielsweise keine Umbruchinhalte für Höhe und Breite.
  2. Bitte überprüfen Sie, ob layoutManager gesetzt ist & setHasFixedSize () erledigt ist.
  3. Erstellen Sie POJO-Klassenvariablen so, dass sie den untergeordneten Firebase-Attributen entsprechen.
  4. FirebaseRecyclerOptions ist eingerichtet.
  5. Die Funktionen onCreateViewHolder () und onBindViewHolder von FirebaseRecyclerAdapter sind vorhanden.
  6. Lebenszyklusereignisse werden berücksichtigt.

Hinweis wrap_content als Höhe des Recyclings zu verwenden, ist einer der einfachsten Fehler, die jemand machen kann. Also überprüfe das zuerst.

1

In meinem Fall setze ich die ID meines RecyclerView auf "RecyclerView". Es scheint, dass diese ID bereits irgendwo definiert wurde, da die Methoden des Adapters richtig aufgerufen wurden, wenn ich sie in eine andere ID änderte.

Link zur Antwort

0

Achten Sie auf das Gewinde, mit dem Sie arbeiten.
In meinem Fall rief das Problem notifyDataSetChanged() von einer Aktivität aus auf, als meine Daten von einem Dienst stammten. Tatsächlich wurde die Methode vom Hintergrundthread aufgerufen. Aber die App stürzte nicht ab und es war nichts in Logcat (!).
Also wurde ich im UI-Thread notifyDataSetChanged() genannt und das Problem gelöst.

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
0
Seyyed

Ich bin kürzlich auf dieses Problem gestoßen und anscheinend gibt es viele mögliche Ursachen. Probieren Sie eine oder eine Kombination dieser Optionen aus, um zu sehen, welche (n) Arbeit (en) für Sie arbeiten :)

1. Layoutmanager
Stellen Sie sicher, dass Sie einen Layout-Manager wie folgt für Ihre Recycler-Ansicht festgelegt haben

// create a layout manager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(my_context);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

// get recycler view
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
// set
recyclerView.setLayoutManager(linearLayoutManager);

2. Feste Größe
Stellen Sie sicher, dass Sie angeben, ob Ihre Recycler-Ansicht eine feste Größe hat oder nicht

// set fixed size
recyclerView.setHasFixedSize(true); // or false depending on implementation

3. XML
Stellen Sie sicher, dass Ihr Recycler nicht in zu vielen Layouts verschachtelt ist, was zu Verwirrung führen kann, z. B. durch Kombination von ScrollView und RelativeLayout. Machen Sie es einfach und sehen Sie, ob es Ihr Problem behebt

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">

<Android.support.v7.widget.RecyclerView
Android:id="@+id/thread_list"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
</LinearLayout>
0
Jonathan Kibet

In meinem Fall hatte a eine Fragment mit RecyclerView innerhalb einer ViewPager. Das Problem erschien, weil ich Fragment.getFragmentManager() anstelle von Fragment.getChildFragmentManager für den Konstruktor meiner FragmentStatePagerAdapter verwendet habe.

P.S. Die Verwendung von Layout Inspector kann beim Debuggen dieser Art von Problem eine große Hilfe sein.

0
Daniil

Ich hatte das gleiche Problem, bei dem weder onCreateViewHolder noch onBindViewHolder aufgerufen wurden. Wenn Sie Ihre onCreateViewHolder-Methode ändern, um den Kontext zu verwenden, in dem Sie einen Verweis im Konstruktor gespeichert haben, anstatt parent.getContext () auszuführen, sollte dies behoben werden:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder called");
    View view = LayoutInflater.from(mContext).inflate(R.layout.row_resource_efficiency, parent, false);
    return new ViewHolder(view);
0
dpspae03

In meinem Fall hatte ich nach dem Ändern von Activity in ViewModel und der Verwendung von Binding vergessen, setContentView aus der onCreate-Methode zu entfernen. Durch das Entfernen wurde mein Problem gelöst.

0
Siamak Ferdos