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;
}
Malinosqui
la source
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();
}
Konstantin Burov
la source
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));
Lay Leangsros
la source
2
Je reviens trop souvent sur cette réponse…
finki
42

j'ai oublié d'ajouter la ligne ci-dessous après l'avoir ajoutée, cela a fonctionné pour moi

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
Sai Gopi N
la source
10
En quoi cette réponse est-elle différente de @Lay Leangsros ci-dessus une réponse?
Mehdi Dehghani
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.

venky
la source
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));
Mandeep Yadav
la source
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

kip2
la source
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!

the_new_mr
la source
6

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

jian lang
la source
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.+'
}
J Wang
la source
4

Ajoutez ceci à votre classe d'adaptateur

 @Override
    public int getItemCount() {
        return mDataset.size();
    } 
Brinda Rathod
la source
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.

ligne de fracture
la source
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é.

Teddy sauvage
la source
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;
}
David Hackro
la source
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;
TharakaNirmana
la source
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 :-)

Bajrang Hudda
la source
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.

Mateusz Wlodarczyk
la source
1

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

Dooie
la source
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();
    }
}
MRX
la source
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.

Yaojin
la source
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.

Meriam
la source
1

Mon erreur gonflait la mauvaise vue dans Fragment onCreateView.

Jeffrey
la source
1

allez dans votre xml. Et modifiez votre mise en page pour envelopper le contenu. Le premier élément cache le suivant, donc les méthodes ne fonctionnent pas!

Koala
la source
1
Bienvenue dans StackOverflow @koala !. Voir ceci Comment écrire la bonne réponse ici stackoverflow.com/help/how-to-answer
Shashin Bhayani
0

Veuillez faire la chose suivante

@Override
public int getItemCount() {
    return data.size();
}
Saurav Mir
la source
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.

Siamak Ferdos
la source
0

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

Catalin
la source
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.

Mesut Beysülen
la source
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 :)

Mattia Ferigutti
la source
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();
}
nkadu1
la source
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"
Ranjith Kumar
la source
0

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

Roseaux Zezi
la source