Recyclerview n'appelle pas onCreateViewHolder
Mon RecyclerView
ne pas appeler onCreateViewHolder
, onBindViewHolder
même MenuViewHolder
constructeur, donc rien ne s'affiche 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<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;
}
22 réponses
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();
}
Un autre est assurez-vous de définir Layout manager sur RecyclerView:
recycler.setLayoutManager(new LinearLayoutManager(this));
J'ai oublié d'ajouter la ligne ci-dessous après avoir ajouté cela a fonctionné pour moi
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
FWIW, Je l'ai observé lorsque j'ai défini l'adaptateur de vue recycler avant que l'adaptateur ne soit réellement initialisé. 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 peut aider quelqu'un d'autre.
Cette raison pourrait être l'utilisation imprudente de la méthode suivante
recyclerView.setHasFixedSize(true);
S'il n'est pas utilisé avec prudence, les onBindView
et onCreateViewHolder
peuvent ne pas être appelés du tout, sans erreur dans les journaux.
Réglage de la hauteur de la 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 un ScrollView
et que j'utilisais la bibliothèque de Support Android 23.0. Pour corriger, j'ai mis à jour la bibliothèque de Support Android 23.2:
Dans la construction.gradle:
dependencies {
...
compile 'com.android.support:appcompat-v7:23.2.+'
compile '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 layout.
Changer pour FrameLayout
aidé.
Ajoutez ceci à votre classe D'Adaptateur
@Override
public int getItemCount() {
return mDataset.size();
}
Veuillez définir layout manager sur RecyclerView comme le code 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 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);
}
}
Codage Heureux :-)
Dans mon cas, je mets l'ID de mon RecyclerView à "recyclerView". Il semble que cet ID ait déjà été défini quelque part, car quand j'ai changé cela en ID différent, les méthodes de l'adaptateur ont été appelées correctement.
Une autre option est si vous envoyez cette liste objetc 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;
}
Si vous utilisez un adaptateur personnalisé, n'oubliez pas de définir ItemCount à la taille de votre collection.
Dans mon cas, ma taille de liste était 0 et elle n'appelait pas onCreateViewHolder méthode. J'avais besoin d'afficher un message au centre de la liste vide en tant qu'espace réservé, donc je l'ai fait comme ça et ça a fonctionné comme un charme. Réponse par @ Konstantin Burov aidé.
@Override
public int getItemCount() {
if (contactList.size() == 0) {
return 1;
} else {
return contactList.size();
}
}
J'ai lutté avec ce problème pendant de nombreuses heures. J'ai été en utilisant un fragment. Et le problème ne renvoyait pas le 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;
Veuillez faire ce qui suit
@Override
public int getItemCount() {
return data.size();
}
Mon encouter était la méthode substituée onBindViewHolder( holder , position) de RecyclerView.l'adaptateur n'est pas appelée. La méthode onCreateViewHolder a été appelée, getItemCount a été appelée. Si vous lisez les spécifications de L'Adaptateur Recyclerview, vous apprendrez que si vous avez remplacé onBindViewHolder( holder, position, List payloads) sera appelé en faveur. Veuillez faire attention.
Si vous mettez wrap_content comme hauteur de votre liste ainsi que la hauteur de votre liste d'éléments, rien n'apparaîtra 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. Qui a résolu mon problème.
Dans mon cas, après avoir changé D'activité pour utiliser ViewModel et DataBinding, j'avais oublié de supprimer la méthode setContentView
appelant la méthode onCreate
. En le supprimant mon problème résolu.
Mon erreur était de gonfler la mauvaise vue dans Fragment onCreateView.
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 appelées du tout... M'a fallu un certain temps pour le comprendre.