Recyclerview n’appelle pas de méthode d’adaptateur: onCreateViewHolder, onBindViewHolder,

mon RecyclerView n’appelle pas onCreateViewHolder, onBindViewHolder, par conséquent, ne semble pas rien dans recyclerview. Je mets des journaux pour le débogage et aucun journal n’est affiché. Ce qui peut être?

Mon adaptateur:

public class CommentListAdapter extends RecyclerView.Adapter{ private static final int EMPTY_VIEW = 10 ; private ArrayList mItems; Boolean firstTime = true; private Typeface mTf = null; Context mContext; public CommentListAdapter(Context context,ArrayList items){ Log.e("Adapter", "constructor Called"); this.mItems = items; mContext = context; } public class EmptyViewHolder extends RecyclerView.ViewHolder { public EmptyViewHolder(View itemView) { super(itemView); } } public class ViewHolder extends RecyclerView.ViewHolder{ TextView mAuthorName; TextView mMessage; NetworkImageView mThumbnail; public ViewHolder(View itemView) { super(itemView); mAuthorName = (TextView)itemView.findViewById(R.id.author_name); mMessage = (TextView)itemView.findViewById(R.id.message); mThumbnail = (NetworkImageView)itemView.findViewById(R.id.author_avatar); } } public void add(comment item, int position) { mItems.add(position, item); notifyItemInserted(position); } public void remove(comment item) { int position = mItems.indexOf(item); mItems.remove(position); notifyItemRemoved(position); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ Log.e("Adapter", "onCreateViewHolder Called"); View v; if(firstTime){ mTf = BBcTypeFace.getTypeFace(parent.getContext().getApplicationContext(),"font/bbc.ttf"); firstTime = false; } if( viewType == EMPTY_VIEW){ v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.comment_empty_row,parent,false); EmptyViewHolder evh = new EmptyViewHolder(v); return evh; }else { v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.comment_row, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { Log.e("Adapter", "onBindViewHolder Called"); if(viewHolder instanceof ViewHolder) { ViewHolder holder = (ViewHolder)viewHolder; comment c = mItems.get(position); Log.e("Adapter", "Comment is\n: " + c.toSsortingng()); final ViewHolder finalHolder = holder; ImageRequest request = new ImageRequest(c.author_img_link, new Response.Listener() { @Override public void onResponse(Bitmap bitmap) { if (bitmap != null) { finalHolder.mThumbnail.setImageBitmap(bitmap); } } }, 0, 0, null, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { VolleyLog.e("ImageLoader", volleyError.getMessage()); VolleyLog.e("ImageLoader", volleyError.getStackTrace()); } }); GetVideoInfo.getInstance(mContext.getApplicationContext()).addToRequestQueue(request); holder.mAuthorName.setText(c.author_name); holder.mMessage.setText(c.Message); holder.mMessage.setTypeface(mTf); holder.mAuthorName.setTypeface(mTf); } } @Override public int getItemCount() { Log.e("Adapter", "getItemCount() Called"); return (mItems.size() > 0 ? mItems.size() : 1); } @Override public int getItemViewType(int position) { Log.e("Adapter", "getItemViewType() Called"); if (mItems.size() == 0) { return EMPTY_VIEW; } return super.getItemViewType(position); }} 

J’utiliserai public void add(comment item, int position){...} pour append un élément dans RecyclerView.

en fragment:

 private RecyclerView mRecyclerView; private CommentListAdapter mAdapter; private LayoutManager mLayoutManager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_item_detail, container, false); .... mLayoutManager = new LinearLayoutManager(getActivity()); mAdapter = new CommentListAdapter(getActivity(),new ArrayList()); mRecyclerView = (RecyclerView)rootView.findViewById(R.id.comment_list); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setAdapter(mAdapter); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); makeJsonObjectRequest(mItem.url); return rootView; } 

Fichiers XML:

  ....  .....   ....  ....  

fichier XML comment_row:

        

Je vais append un article à RecyclerView avec ce code:

 JsonObjectRequest jsonObjReqComment = new JsonObjectRequest(Request.Method.GET,urlJsonObj+"#comment", null, new Response.Listener() { @Override public void onResponse(JSONObject response) { try { JSONArray res = response.getJSONArray("response"); //Log.e("Comment","Count:"+response.toSsortingng()); //Log.e("Comment","Count:"+res.length()); for (int i = 0; i < res.length(); i++) { JSONObject thread = res.getJSONObject(i); JSONObject author_json = thread.getJSONObject("author"); int dislikes = thread.getInt("dislikes"); int likes = thread.getInt("likes"); String Message = thread.getString("message"); //get Author info String author_img_link = author_json.getJSONObject("avatar").getString("permalink"); String author_name = author_json.getString("name"); comment c = new comment(dislikes,likes,Message,author_img_link,author_name); //Log.e("Comment",c.toString()); //commentsList.add(c); mAdapter.add(c,0); } } catch (JSONException e) { Log.e("OnResponse","Error JSON"); e.printStackTrace(); } catch (Exception e){ Log.e("OnResponse","Error Exception"); e.printStackTrace(); } } } , new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d("vOLLEY", "Error: " + error.getMessage()); // hide the progress dialog } } ){ @Override public Map getHeaders(){ Map headers = new HashMap(); headers.put("User-agent", "Comment"); return headers; } }; 

Comme @yigit devine la combinaison de ScrollView , RelativeLayout provoque ce problème, faites simplement plus de place à RecyclerView .

À part la réponse de @ SanatiSharif et @ sohrab, vous devez suivre les étapes obligatoires ci-dessous.

Assurez-vous d’appeler setLayoutManager , quelque chose comme ci-dessous.

 recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 

avant de mettre l’adaptateur dans recyclerView, sinon cela ne fonctionnera pas. Vous pouvez le personnaliser si vous en avez besoin. Ce lien vous donnera une idée du fonctionnement de LayoutManager.

Si RecyclerView est placé dans un ScrollView, sa hauteur n’est pas spécifiée pendant l’étape de mesure (car ScrollView autorise toute hauteur) et est égale à la hauteur minimale (selon l’implémentation) qui est apparemment nulle.

ref: android: RecyclerView dans un ScrollView

Solution: – mettre des vues dans la rangée de RecyclerViews – Calculer la taille des éléments de la liste et définir la hauteur de ListView par programmation http://vardhan-justlikethat.blogspot.com/2014/04/android-listview-inside-scrollview.html

C’est en retard mais j’espère que cela aidera Somone. essayez l’une des méthodes suivantes:

première solution: assurez-vous de ne pas avoir utilisé cette ligne inutilement

 recyclerView.setHasFixedSize(true); 

deuxième solution: assurez-vous de définir le gestionnaire de disposition sur recyclerView

 recycler.setLayoutManager(new LinearLayoutManager(this)); 

troisième solution: getItemCount renvoie 0, donc RecyclerView getItemCount jamais d’instancier une vue. Faites-lui retourner quelque chose de plus grand que 0

Cela aurait pu être un cas différent, mais pour moi, j’ai juste oublié de configurer le gestionnaire de mise en page comme suit:

 LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); recycler.setLayoutManager(layoutManager); 

J’espère que cela aide 🙂

Bien sûr, RecyclerView dans ScrollView est une mauvaise pratique. Mais si c’est vraiment nécessaire, il est possible d’utiliser ce gestionnaire de mise en page:

https://github.com/serso/android-linear-layout-manager

Il redimensionnera RecyclerView et sera visible même dans ScrollView.

Dans mon cas, j’avais cette structure

      

j’ai résolu le problème supprimer Relative

    

Dans mon cas, j’utilisais l’élément Fragment-> ViewPager et Tablayout-> Inside viewpagers dans lequel j’utilisais RecyclerView.

Donc, au lieu d’appeler ViewPagerAdapter (getChildFragmentManager ()) , j’appelais ViewPagerAdapter (getSupportFragmentManager ()), c’est pourquoi aucun élément de mon adaptateur de recycleur n’est appelé.

Donc, la bonne façon de définir le ViewPagerAdapter dans un fragment est

ViewPagerAdapter (getChildFragmentManager ())

Est un peu idiot, mais une autre chose qui peut bloquer les appels aux méthodes est de déclarer la visibilité de la vue en tant que GONE.

 android:visibility="gone" recyclerView.setVisibility(View.GONE); 

N’importe lequel de ces éléments bloquera l’appel des méthodes dans RecyclerView.Adapter

J’espère que ça peut aider quelqu’un.