Recyclerview n'appelle pas onCreateViewHolder


150

Mon RecyclerViewn'appelle pas onCreateViewHolder, onBindViewHoldermême MenuViewHolderconstructeur, donc rien n'apparaît dans RecyclerView. J'ai mis 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<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);
    }
}

Ma ligne XML personnalisée:

<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"/>

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

pourquoi vous définissez recyclerView.setAdapter (adaptateur); 2 fois?
Panayiotis Irakleous

Une autre cause de ce problème est de faire correspondre par erreur la disposition de l'élément à la hauteur du parent, de sorte qu'un seul élément est affiché à la fois.
Joe Lapp

Dans mon cas, aidez-moi ceci: facturesRecyclerView.setHasFixedSize (true) facturesRecyclerView.setLayoutManager (GridLayoutManager (this, 1))
a_subscriber

Réponses:


239

Votre getItemCountméthode returns 0. N'essaye donc RecyclerViewjamais d'instancier une vue. Faites-lui retourner quelque chose greater than 0.

par exemple

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

25
oh mon Dieu, je me sens si stupide en ce moment! : facepalm: Merci pour cela!
Shinta S

3
Je viens de perdre une heure à cela parce que le getItemCount était bien en dessous de tous les autres codes et je ne l'ai pas vu. : |
Joel

J'avais un adaptateur personnalisé et j'avais oublié de régler mon nombre d'articles à la taille de ma collection
Dooie

3
mon nombre d'éléments n'est toujours pas visible, aucun point de débogage ne vient dans onBind ou onCreateHolder ... mais il vient dans getItemCount
Dr. aNdRO

Oh mec! Moi aussi, je me battais avec ça pour comprendre pourquoi diable mon point d'arrêt ne frappe pas et maintenant je sais ... LOL! ZUT!!! JE VOUS REMERCIE!
Vincy

409

Une autre consiste à vous assurer de définir le gestionnaire de mise en page sur RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

2
Je reviens trop souvent sur cette réponse…
finki


15

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 non utilisé avec précaution, cela pourrait provoquer la onBindViewet onCreateViewHolderde ne pas être appelé à tout, sans erreur dans les journaux.


12

Veuillez configurer le gestionnaire de mise en page pour qu'il RecyclerViewaime le code ci-dessous:

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

9

Pour ce que cela vaut, je l'ai observé lorsque j'ai défini l'adaptateur de vue du recycleur avant que l'adaptateur ne soit réellement initialisé. La solution était de s'assurer que l' recyclerView.setAdapter(adapter)appelait avec un adaptateur non nul


9

J'espère vraiment vraiment que cela aidera quelqu'un un jour. Je viens de passer plus d'une heure sur celui-ci à devenir fou!

J'avais ceci:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

Quand j'aurais dû avoir ça:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

Parce que j'ai bêtement appelé mon adaptateur adapter, il était masqué par l'adaptateur de la vue du recycleur dans le bloc Apply! J'ai renommé l'adaptateur en projectAdapter pour le différencier et le problème est résolu!


6

Réglage de la hauteur du TextViewdans custom.xmlou RecyclerView. Si la hauteur est wrap-content, le RecyclerViewne sera pas visible.


J'ai passé tellement de temps là-dessus ... la hauteur de la vue du recycleur était nulle. Lorsqu'il est utilisé dans une activité, il s'est en quelque sorte développé. Dans un fragment à l'intérieur d'autres mises en page ... ce n'est pas le cas
Asif Shiraz

4

Cela s'est produit lorsque j'étais RecyclerViewdans un ScrollViewet que j'utilisais la bibliothèque de support Android 23.0. Pour corriger, j'ai mis à jour vers la bibliothèque de support Android 23.2:

Dans build.gradle:

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

4

Ajoutez ceci à votre classe d'adaptateur

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

aussi, c'est un doublon
Ricardo A.

4

Peut-être que cela aide quelqu'un, mais si vous définissez la visibilité de votre RecycleView sur GONE, les méthodes de l'adaptateur ne seront pas du tout appelées ... Il m'a fallu un certain temps pour le comprendre.


incroyable !!!!! ... tanks so much ,,,
X-Black ...

3

J'ai eu le même problème, car j'utilisais android.support.constraint.ConstraintLayouten ressource de mise en page. Changer pour FrameLayoutaidé.


Merci pour votre solution. Une idée de la raison pour laquelle il se comporte comme ça si le parent View l'est android.support.constraint.ConstraintLayout?
Adrian Buciuman

2

Une autre option est si vous envoyez cet objet de liste en utilisant get, vérifiez si vous avez une référence correcte, par exemple

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}

2

J'ai lutté avec ce problème pendant de nombreuses heures. J'utilisais un fragment. Et le problème ne retournait pas le fichier 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;

Code étrange. Ces variables et classes sont difficiles à comprendre.
CoolMind

2

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({"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);
        }
    }

Bon codage :-)


1

Dans mon cas, j'ai défini l'ID de mon RecyclerView sur "recyclerView". Il semble que cet ID ait déjà été défini quelque part, car lorsque je l'ai changé pour un ID différent, les méthodes de l'adaptateur ont été appelées correctement.


1

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


1

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

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

Ce n'est pas une très bonne idée. Il est préférable de définir la visibilité du message vide lors de la mise des données sur l'adaptateur.
L'incroyable

1

Mon encouter était la méthode remplacée onBindViewHolder (titulaire, position) du RecyclerView.adaptor qui n'était pas appelée. La méthode onCreateViewHolder a été appelée, getItemCount a été appelé. Si vous lisez les spécifications de l'adaptateur Recyclerview, vous apprendrez que si vous avez remplacé onBindViewHolder (titulaire, position, liste des charges utiles) sera appelé en faveur. Alors soyez prudent.


Comment avez-vous résolu un problème de non-appel onBindViewHolder?
CoolMind

1

Si vous mettez wrap_content comme 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.


1

Mon erreur gonflait la mauvaise vue dans Fragment onCreateView.



0

Veuillez faire la chose suivante

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

0

Dans mon cas, après avoir changé Activity pour utiliser ViewModel et DataBinding, j'avais oublié de supprimer l' setContentViewappel de onCreateméthode de method. En le supprimant, mon problème a été résolu.


0

Pour moi, c'était parce que setHasStableIds (true); méthode a été définie. Supprimez cela et cela fonctionnera


Mais cette méthode ne semble pas être dans l' exemple reproductible minimal de la question. Si la suppression de cet indice corrige quelque chose, c'est probablement une indication d'un bogue dans l'implémentation du détenteur de la vue ou peut-être du notificateur.

0

recyclerView.setAdapter (adaptateur); appelée La liste recyclerView est remplie en appelant la méthode.


0

Assurez-vous que votre code XMLet votre Koltin/Javacorrespondance. Dans mon cas, j'ai eu un problème avec le ViewHolderdepuis que j'avais écrit:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

Mais puisque mon code XML est:

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

J'ai dû changer la ligne privée en:

var txt: TextView = itemView.findViewById(R.id.txt)

De plus, j'ai également dû supprimer:

recyclerView.setHasFixedSize(true);

J'espère que cela pourra vous aider :)


0

Dans mon cas, je manquais d'appeler notifyDataSetChanged()après avoir défini la liste dans l'adaptateur.

public void setUserList(List<UserList> userList) {
      this.userList = userList;
        notifyDataSetChanged();
}

0

Dans mon cas, je manque de définir l'orientation dans mon LinearLayout.

Après l'ajout du problème d'orientation résolu.

 android:orientation="vertical"

0

Mon problème était layout_heightet layout_widthdu RecyclerView réglé sur 0dp.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.