web-dev-qa-db-fra.com

Recyclerview ne pas appeler onCreateViewHolder

Ma RecyclerView n'appelle pas le constructeur onCreateViewHolder, onBindViewHolder même MenuViewHolder, donc rien n'apparaît dans RecyclerView. J'ai mis des journaux pour le débogage et aucun journal n'est affiché .

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 personnalisée 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"/>

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

Votre méthode getItemCountreturns 0. Donc, RecyclerView n'essaie jamais d'instancier une vue. Faites-le retourner quelque chose greater than 0.

par exemple

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

Une autre solution consiste à définir le gestionnaire de disposition sur RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));
331
Lay Leangsros

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

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

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

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

recyclerView.setHasFixedSize(true);

Si vous ne l'utilisez pas avec précaution, les onBindView et onCreateViewHolder risquent de ne pas être appelés du tout, sans erreur dans les journaux.

9
venky

Pour ce que cela vaut, je l'ai observé lorsque j'ai défini l'adaptateur de vue Recycler avant l'adaptateur a été réellement initialisé. La solution a été de s'assurer que recyclerView.setAdapter(adapter) était appelé avec un adaptateur non null 

8
kip2

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

5
jian lang

Cela s'est produit lorsque ma RecyclerView était dans une ScrollView et que j'utilisais Android Support Library 23.0. Pour résoudre ce problème, j'ai mis à jour Android Support Library 23.2:

Dans build.gradle:

dependencies {
    ...
    compile 'com.Android.support:appcompat-v7:23.2.+'
    compile 'com.Android.support:cardview-v7:23.2.+'
}
4
J Wang

Ajoutez ceci à votre classe d'adaptateur

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

Cela peut peut-être aider quelqu'un, mais si vous définissez la visibilité de votre RecycleView sur GONE, les méthodes de l'adaptateur ne seront pas appelées du tout ... m'a pris du temps pour le comprendre.

3
breakline

Veuillez définir le gestionnaire de disposition sur RecyclerView comme 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));
3
Mandeep Yadav

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

3
Wild Teddy

Voir ma réponse si vous utilisez la bibliothèque de liaisons de données Android - Assurez-vous que vous définissez la présentation 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);
        }
    }

Bonne codage :-)

2
Bajrang Hudda

J'ai lutté avec ce problème pendant plusieurs heures. J'utilisais un fragment. Et le problème ne renvoyait pas la view. Ci-dessous 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;
2
TharakaNirmana

Une autre option est si vous envoyez cet objet de liste en utilisant get, vérifiez si vous avez la 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
David Hackro

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

1
Dooie

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 j'ai changé cet ID en un ID différent, les méthodes de l'adaptateur ont été appelées correctement.

1

Si vous définissez wrap_content comme hauteur de votre liste et de celle de votre liste d'éléments, rien ne s'affiche 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
Meriam

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

1
Yaojin

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

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

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

0
Siamak Ferdos

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

0
Mesut Beysülen

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

0
Jeffrey

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

0
Koala

S'il vous plaît faire la chose suivante 

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

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

J'ai eu ceci:

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

Quand j'aurais dû avoir ceci:

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

Comme j’ai bêtement appelé mon adaptateur adapter, il était masqué par l’adaptateur de la vue Recycler dans le bloc apply! J'ai renommé l'adaptateur en projectAdapter pour le différencier et résoudre le problème!

0
the_new_mr

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

0
Catalin