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;
}
Votre méthode getItemCount
returns 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();
}
Une autre solution consiste à définir le gestionnaire de disposition sur RecyclerView:
recycler.setLayoutManager(new LinearLayoutManager(this));
j'ai oublié d'ajouter la ligne ci-dessous après l'ajout, cela a fonctionné pour moi
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
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.
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
Définition de la hauteur de TextView
dans custom.xml
ou RecyclerView
. Si height est wrap-content
, le RecyclerView
ne sera pas visible.
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.+'
}
Ajoutez ceci à votre classe d'adaptateur
@Override
public int getItemCount() {
return mDataset.size();
}
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.
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));
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é.
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 :-)
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;
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;
}
Si vous utilisez un adaptateur personnalisé, n'oubliez pas de définir ItemCount à la taille de votre collection.
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.
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.
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.
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();
}
}
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.
recyclerView.setAdapter (adaptateur); La liste recyclerView est remplie en appelant la méthode.
Mon erreur était de gonfler la fausse vue dans Fragment onCreateView.
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!
S'il vous plaît faire la chose suivante
@Override
public int getItemCount() {
return data.size();
}
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!
Pour moi, c’est parce que le setHasStableIds (true); méthode a été définie . Supprimez cela et cela fonctionnera