Recyclerview n’appelle pas onCreateViewHolder

Mon RecyclerView n’appelle pas onCreateViewHolder , onBindViewHolder même le constructeur MenuViewHolder , par conséquent, rien n’apparaît dans RecyclerView . Je mets des journaux pour le débogage et aucun journal n’est affiché. Quel pourrait être le problème?

Mon adaptateur:

 public class MenuAdapter extends RecyclerView.Adapter { private LayoutInflater inflater; List data = Collections.emptyList(); public MenuAdapter(Context context, List data) { Log.i("DEBUG", "Constructor"); inflater = LayoutInflater.from(context); Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toSsortingng()); 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); } } 

Ma ligne XML personnalisée:

   

et mon 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; } 

Votre méthode getItemCount returns 0 . Donc, RecyclerView jamais d’instancier une vue. Faites-lui retourner quelque chose de greater than 0 .

Un autre est de vous assurer que vous définissez le gestionnaire de disposition sur RecyclerView:

 recycler.setLayoutManager(new LinearLayoutManager(this)); 

J’ai oublié d’append la ligne ci-dessous après avoir ajouté que cela a fonctionné pour moi

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

FWIW, je l’ai observé lorsque j’ai défini l’adaptateur de vue du recycleur avant que la carte ne soit réellement initialisée. La solution consistait à s’assurer que recyclerView.setAdapter(adapter) était appelé avec un adaptateur non NULL.

Cela ne s’applique pas à votre cas particulier. Mais cela pourrait aider quelqu’un d’autre.

Cette raison pourrait être une utilisation imprudente de la méthode suivante

 recyclerView.setHasFixedSize(true); 

Si elle n’est pas utilisée avec précaution, les onBindView et onCreateViewHolder de ne pas être appelés, sans erreur dans les journaux.

Définition de la hauteur de TextView dans le custom.xml ou RecyclerView . Si la hauteur est wrap-content , le RecyclerView ne sera pas visible.

Cela s’est produit lorsque mon RecyclerView était dans ScrollView et que j’utilisais Android Support Library 23.0. Pour corriger, j’ai mis à jour vers Android Support Library 23.2:

Dans build.gradle:

 dependencies { ... comstack 'com.android.support:appcompat-v7:23.2.+' comstack 'com.android.support:cardview-v7:23.2.+' } 

J’ai eu le même problème, car j’utilisais android.support.constraint.ConstraintLayout dans la ressource de présentation. FrameLayout à FrameLayout aidé.

Ajoutez ceci à votre classe d’adaptateur

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

Veuillez définir le gestionnaire de disposition sur RecyclerView comme ci-dessous:

RecyclerView recyclerView = (RecyclerView) findViewById (R.id.recycler_view_right); NavigationAdapter adapter = new NavigationAdapter (this, FragmentDrawer.getData ()); recyclerView.setAdapter (adaptateur); recyclerView.setLayoutManager (nouveau LinearLayoutManager (this));

Voir ma réponse si vous utilisez la bibliothèque de liaison de données Android – Assurez-vous que vous définissez la mise en page pour recyclerview et que le nombre d’éléments doit être supérieur à 0

  @BindingAdapter({"ensortinges", "layout"}) public static void setEnsortinges(RecyclerView view, ArrayList 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); } } 

Heureux codage 🙂

Dans mon cas, je définis l’ID de mon RecyclerView sur “recyclerView”. Il semble que cet identifiant ait déjà été défini quelque part, car lorsque je l’ai changé en ID différent, les méthodes de l’adaptateur ont été appelées correctement.

Autre option: si vous envoyez cette liste objectc en utilisant get, vérifiez si vous avez une référence correcte, par exemple

 private list listObjetc; //Incorrect public void setListObjetcs(list listObjetc){ listObjetc = listObjetc; } //Correct public void setListObjetcs(list listObjetc){ this.listObjetc = listObjetc; } 

Si vous utilisez un adaptateur personnalisé, n’oubliez pas de définir ItemCount à la taille de votre collection.

Dans mon cas, la taille de ma liste était 0 et elle n’appelait pas la méthode onCreateViewHolder. J’avais besoin d’afficher un message au centre pour la liste vide en tant qu’espace réservé donc je l’ai fait comme ça et ça a fonctionné comme du charme. Réponse de @Konstantin Burov a aidé.

  @Override public int getItemCount() { if (contactList.size() == 0) { return 1; } else { return contactList.size(); } } 

J’ai lutté contre ce problème pendant plusieurs heures. J’utilisais un fragment. Et le problème ne revenait pas à la view . Voici mon 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; 

S’il vous plaît faire la chose suivante

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

Mon encouter était la méthode de substitution onBindViewHolder (holder, position) du RecyclerView.adaptor non appelé. La méthode onCreateViewHolder a été appelée, getItemCount a été appelé. Si vous lisez les spécifications de Recyclerview Adapter, vous apprendrez que si vous avez outrepassé onBindViewHolder (titulaire, position, liste des charges utiles) sera appelé en faveur. Alors s’il vous plaît soyez prudent.

Si vous placez wrap_content en hauteur de votre liste ainsi que la hauteur de votre liste d’éléments, rien ne s’affichera et aucune de vos fonctions recyclerView ne sera appelée. Fixez la hauteur de l’élément ou mettez match_parent pour la hauteur de la liste. Cela a résolu mon problème.

Dans mon cas, après avoir modifié Activity pour utiliser ViewModel et DataBinding, j’avais oublié de supprimer la méthode setContentView appelant de la méthode onCreate . En le supprimant, mon problème a été résolu.

Mon erreur était de gonfler la vue erronée dans Fragment onCreateView.