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;
}
94
demandé sur RobC 2015-01-07 03:18:01

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();
}
171
répondu Konstantin Burov 2018-09-26 03:43:47

Un autre est assurez-vous de définir Layout manager sur RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));
304
répondu Lay Leangsros 2016-06-22 13:12:37

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

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
24
répondu saigopi 2018-01-26 20:17:45

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

8
répondu kip2 2015-07-09 14:42:29

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.

8
répondu venky 2017-02-05 16:25:09

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.

4
répondu jian lang 2016-07-06 14:54:23

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.+'
}
4
répondu J Wang 2016-09-28 21:22:18

J'ai eu le même problème, car j'utilisais android.support.constraint.ConstraintLayout dans la ressource layout. Changer pour FrameLayout aidé.

3
répondu Wild Teddy 2017-06-25 10:31:29

Ajoutez ceci à votre classe D'Adaptateur

 @Override
    public int getItemCount() {
        return mDataset.size();
    } 
3
répondu Brinda Rathod 2018-01-12 15:05:04

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

2
répondu Mandeep Yadav 2017-04-14 13:08:32

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

2
répondu Bajrang Hudda 2018-03-21 12:09:21

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.

1
répondu Mateusz Wlodarczyk 2017-05-07 23:14:55

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;
}
1
répondu David Hackro 2017-05-22 20:26:25

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

1
répondu Dooie 2017-06-05 11:24:50

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();
    }
}
1
répondu MRX 2017-07-05 18:02:54

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;
1
répondu TharakaNirmana 2017-10-20 07:12:16

Veuillez faire ce qui suit

@Override
public int getItemCount() {
    return data.size();
}
1
répondu Saurav Mir 2017-12-04 05:35:36

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.

1
répondu Yaojin 2018-03-11 14:23:19

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.

1
répondu Meriam 2018-05-05 16:54:42

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.

0
répondu Siamak Ferdos 2018-08-09 08:39:16

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

0
répondu Jeffrey 2018-08-14 21:57:52

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.

0
répondu breakline 2018-09-14 11:10:51