Meine Variable RecyclerView
ruft nicht onCreateViewHolder
, onBindViewHolder
sogar MenuViewHolder
Konstruktor auf, daher erscheint in RecyclerView
..__ nichts. Ich lege Protokolle zum Debuggen an, und es wird kein Protokoll angezeigt . Was könnte das Problem sein?
Mein Adapter:
public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
private LayoutInflater inflater;
List<Menu> data = Collections.emptyList();
public MenuAdapter(Context context, List<Menu> data) {
Log.i("DEBUG", "Constructor");
inflater = LayoutInflater.from(context);
Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toString());
this.data = data;
for(Menu menu: this.data){
Log.i("DEBUG MENU - CONSTRUCTOR", menu.menu);
}
}
@Override
public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.row_menu, parent, false);
MenuViewHolder holder = new MenuViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
Log.i("DEBUG MENU", "onBindViewHolder");
Menu current = data.get(position);
holder.title.setText(current.menu);
}
@Override
public int getItemCount() {
return 0;
}
class MenuViewHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView icon;
public MenuViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.menuText);
}
}
Meine benutzerdefinierte Zeilen-XML:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="horizontal" Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/menuText"
Android:text="Dummy Text"
Android:layout_gravity="center_vertical"
Android:textColor="#222"/>
und mein Fragment:
public NavigationFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
if (savedInstanceState != null) {
mFromSavedInstaceState = true;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_navigation, container, false);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.drawer_list);
MenuAdapter adapter = new MenuAdapter(getActivity(), getData());
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
return view;
}
Ihre getItemCount
-Methode returns 0
. Also versucht RecyclerView
nie, eine Ansicht zu instanziieren. Lass etwas greater than 0
zurückgeben.
zum Beispiel
@Override
public int getItemCount() {
return data.size();
}
Eine andere ist, stellen Sie sicher, dass Sie den Layout-Manager auf RecyclerView setzen:
recycler.setLayoutManager(new LinearLayoutManager(this));
ich habe vergessen, die folgende Zeile hinzuzufügen, nachdem ich es hinzugefügt hatte
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
Dies gilt nicht für Ihren speziellen Fall. Aber das könnte jemand anderem helfen.
Dieser Grund könnte die folgende Methode leichtfertig verwenden
recyclerView.setHasFixedSize(true);
Wenn Sie nicht mit Vorsicht verwendet werden, kann dies dazu führen, dass onBindView
und onCreateViewHolder
überhaupt nicht aufgerufen werden, ohne dass Fehler in den Protokollen auftreten.
Für das, was es wert ist, habe ich es beobachtet, als ich den Adapter für die Recycler-Ansicht gesetzt habe vorher der Adapter wurde tatsächlich initialisiert. Die Lösung bestand darin, sicherzustellen, dass recyclerView.setAdapter(adapter)
mit einem Nicht-Null-Adapter aufgerufen wurde
Einstellen der Höhe von TextView
in custom.xml
oder RecyclerView
Wenn height wrap-content
ist, ist RecyclerView
nicht sichtbar.
Dies geschah, als sich meine RecyclerView
in einer ScrollView
befand und ich Android Support Library 23.0 verwendete. Zur Fehlerbehebung habe ich die Android Support Library 23.2 aktualisiert:
In build.gradle:
dependencies {
...
compile 'com.Android.support:appcompat-v7:23.2.+'
compile 'com.Android.support:cardview-v7:23.2.+'
}
Fügen Sie dies Ihrer Adapterklasse hinzu
@Override
public int getItemCount() {
return mDataset.size();
}
Vielleicht hilft es jemandem, aber wenn Sie die Sichtbarkeit Ihres RecycleView auf GONE setzen, werden die Adapter-Methoden überhaupt nicht aufgerufen.
Setzen Sie den Layout-Manager auf RecyclerView
wie im folgenden Code:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Ich hatte das gleiche Problem, weil ich Android.support.constraint.ConstraintLayout
in der Layout-Ressource verwendete Das Umstellen auf FrameLayout
hat geholfen.
Siehe meine Antwort, wenn Sie eine Android-Datenbindungsbibliothek verwenden - Stellen Sie sicher, dass Sie das Layout für die Wiederverwendungsübersicht einstellen und die Elementanzahl größer als 0 sein muss
@BindingAdapter({"entries", "layout"})
public static void setEntries(RecyclerView view, ArrayList<LoginResponse.User> listOfUsers, int layoutId) {
if (view.getAdapter() == null) {
view.setLayoutManager(new LinearLayoutManager(view.getContext()));
SingleLayoutAdapter adapter = new SingleLayoutAdapter(layoutId) {
@Override
protected Object getObjForPosition(int position) {
return listOfUsers.get(position);
}
@Override
public int getItemCount() {
return listOfUsers.size();
}
};
view.setAdapter(adapter);
}
}
Viel Spaß beim Codieren :-)
Ich hatte viele Stunden mit diesem Thema zu kämpfen. Ich habe ein Fragment benutzt. Und das Problem war nicht die view
. Unten ist mein Code:
ProductGridBinding binding = DataBindingUtil.inflate( inflater, R.layout.product_grid, container, false);
mLinearLayoutManager = new LinearLayoutManager(getActivity());
mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
binding.rvNumbers.setHasFixedSize(true);
binding.rvNumbers.setLayoutManager(mLinearLayoutManager);
binding.rvNumbers.setAdapter(adapter);
View view = binding.getRoot();
return view;
Eine andere Option ist, wenn Sie dieses Listenobjekt mithilfe von get senden
private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
listObjetc = listObjetc;
}
//Correct
public void setListObjetcs(list<objetc> listObjetc){
this.listObjetc = listObjetc;
}
Wenn Sie einen benutzerdefinierten Adapter verwenden, vergessen Sie nicht, die ItemCount auf die Größe Ihrer Sammlung festzulegen.
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.
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. Legen Sie die Höhe des Elements fest oder setzen Sie match_parent für die Listenhöhe. Das hat mein Problem gelöst.
Ich hoffe wirklich wirklich , dass dies irgendwann jemandem hilft. Ich verbringe gerade mehr als eine Stunde damit, dass dieser verrückt wird!
Ich hatte das:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = adapter
}
Wann hätte ich das haben sollen:
projects_recycler_view.apply {
this.layoutManager = linearLayoutManager
this.adapter = projectAdapter
}
Da ich meinen Adapter dummerweise adapter
genannt habe, wurde er vom Adapter der Recycler-Ansicht im Apply-Block abgeschattet! Ich habe den Adapter in projectAdapter umbenannt, um ihn zu unterscheiden und das Problem zu lösen!
Mein Encouter war die überschriebene Methode onBindViewHolder (holder, position), bei der der RecyclerView.adaptor nicht aufgerufen wurde. Die Methode onCreateViewHolder wurde aufgerufen, getItemCount wurde aufgerufen. Wenn Sie die Spezifikationen für Recyclerview Adapter lesen, werden Sie erfahren, dass onBindViewHolder (Inhaber, Position, Listennutzlast) überschrieben wird. Also sei bitte vorsichtig.
In meinem Fall war meine Listengröße 0 und die Methode onCreateViewHolder Wurde nicht aufgerufen. Ich musste eine Nachricht in der Mitte für die leere Liste als Platzhalter anzeigen, also tat ich es so und es funktionierte wie Charme. Antwort von @Konstantin Burov hat geholfen.
@Override
public int getItemCount() {
if (contactList.size() == 0) {
return 1;
} else {
return contactList.size();
}
}
In meinem Fall hatte ich nach dem Ändern von Activity zur Verwendung von ViewModel und DataBinding vergessen, die Aufrufe der setContentView
-Methode von der onCreate
-Methode zu entfernen. Durch das Entfernen wurde mein Problem gelöst.
recyclerView.setAdapter (Adapter); called Die recyclerView-Liste wird durch Aufrufen der Methode gefüllt.
Mein Fehler war, die falsche Ansicht in Fragment onCreateView aufzublähen.
gehe zu deiner xml. Und ändern Sie Ihr Layout, um den Inhalt zu umbrechen. Das eine Element versteckt das nächste, daher funktionieren die Methoden nicht!
Bitte machen Sie folgendes
@Override
public int getItemCount() {
return data.size();
}
Für mich war es wegen der setHasStableIds (true); Methode wurde gesetzt . Entfernen Sie das und es wird funktionieren