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);
}
}
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
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.
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"/>
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.
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.
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.
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.
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.
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.
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!
Wenn Sie FirebaseListAdapter implementieren, müssen Sie die folgenden Punkte beachten, um es korrekt einzurichten.
Hinweis wrap_content als Höhe des Recyclings zu verwenden, ist einer der einfachsten Fehler, die jemand machen kann. Also überprüfe das zuerst.
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.
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();
}
});
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>
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.
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);
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.