Recyclerview no llama a ningún método de adaptador: onCreateViewHolder, onBindViewHolder,

my RecyclerView no llama aCreateViewHolder, onBindViewHolder, por lo tanto, no aparece nada en recyclerview. Puse registros para la depuración y no se muestra ningún registro. ¿Que puede ser?

Mi adaptador:

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.toString()); 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); }} 

public void add(comment item, int position){...} para agregar el elemento en RecyclerView.

en Fragmento:

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

Archivos XML:

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

comment_row archivo xml:

        

Agregaré el artículo a RecyclerView con este código:

 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.toString()); //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; } }; 

Como @yigit adivina que la combinación de ScrollView , RelativeLayout causa este problema, solo crea más espacio para RecyclerView .

Además de la respuesta de @ SanatiSharif y @sohrab, debes seguir el paso obligatorio a continuación.

Asegúrese de llamar a setLayoutManager , algo como a continuación.

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

antes de configurar el adaptador en recyclerView, de lo contrario, no va a funcionar. Puedes personalizarlo si lo necesitas. este enlace le dará una idea de cómo funciona LayoutManager.

Si RecyclerView se pone en un ScrollView, durante el paso de medida su altura no se especifica (porque ScrollView permite cualquier altura) y obtiene la altura mínima (según la implementación) que aparentemente es cero.

ref: android: RecyclerView dentro de ScrollView

Solución: coloque vistas en la fila de RecyclerViews. Calcule el tamaño de los elementos de la lista y establezca el alto del ListView mediante progtwigción http://vardhan-justlikethat.blogspot.com/2014/04/android-listview-inside-scrollview.html

Es tarde, pero espero que ayude a alguien. Pruebe cualquiera de los siguientes:

primera solución: asegúrese de no haber usado esta línea innecesariamente

 recyclerView.setHasFixedSize(true); 

segunda solución: asegúrese de configurar el administrador de diseño en recyclerView

 recycler.setLayoutManager(new LinearLayoutManager(this)); 

tercera solución: getItemCount devuelve 0, por lo que RecyclerView nunca intenta crear una instancia de una vista. Hacer que devuelva algo mayor que 0

Podría haber sido un caso diferente, pero para mí me olvidé de configurar el administrador de diseño de la siguiente manera:

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

Espero eso ayude 🙂

Por supuesto, RecyclerView en ScrollView es una mala práctica. Pero si es realmente necesario, es posible si usa este Administrador de diseño:

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

Cambiará el tamaño de RecyclerView y sería visible incluso en ScrollView.

En mi caso tuve esta estructura

      

resolví el problema eliminar Relativo

    

En mi caso, estaba usando Fragment-> ViewPager y Tablayout -> Ítem de viewpagers internos. Utilicé RecyclerView.

Entonces, en lugar de llamar a ViewPagerAdapter (getChildFragmentManager ()) , estaba llamando a ViewPagerAdapter (getSupportFragmentManager ()), es por eso que no se está llamando a ninguno de los elementos de mi adaptador de reciclaje.

Entonces, la forma correcta de configurar el ViewPagerAdapter dentro de un fragmento es

ViewPagerAdapter (getChildFragmentManager ())

Es algo tonto, pero otra cosa que puede bloquear las llamadas a los métodos es declarar la visibilidad de la vista como GONE.

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

Cualquiera de estos bloqueará la llamada de los métodos en RecyclerView.Adapter

Espero que pueda ayudar a alguien.