tutorial studio recyclerview make how example ejemplo create card and java android listadapter android-recyclerview

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



recyclerview android studio ejemplo (8)

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

ref: android: RecyclerView dentro de un ScrollView

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

mi RecyclerView no llama a onCreateViewHolder, 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<RecyclerView.ViewHolder>{ private static final int EMPTY_VIEW = 10 ; private ArrayList<comment> mItems; Boolean firstTime = true; private Typeface mTf = null; Context mContext; public CommentListAdapter(Context context,ArrayList<comment> 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<Bitmap>() { @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 un 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<comment>()); 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:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/scrollView" android:background="@android:color/white" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentBottom="true"> .... <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> ..... <android.support.v7.widget.RecyclerView android:id="@+id/comment_list" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> .... </RelativeLayout> .... </ScrollView>

comentario xrow archivo xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:background="@android:color/darker_gray"> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:id="@+id/author_name" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/author_avatar" android:layout_toStartOf="@+id/author_avatar" android:gravity="right" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/message" android:layout_below="@+id/author_name" android:layout_toLeftOf="@+id/author_avatar" android:layout_toStartOf="@+id/author_avatar" android:gravity="right" /> </LinearLayout> <com.android.volley.toolbox.NetworkImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/author_avatar" android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:minHeight="150dp" android:minWidth="150dp" /></LinearLayout>

Agregaré un elemento a RecyclerView con este código:

JsonObjectRequest jsonObjReqComment = new JsonObjectRequest(Request.Method.GET,urlJsonObj+"#comment", null, new Response.Listener<JSONObject>() { @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<String, String> getHeaders(){ Map<String, String> headers = new HashMap<String, String>(); headers.put("User-agent", "Comment"); return headers; } };


Además de la respuesta de @ SanatiSharif y @ sohrab, debe seguir el siguiente paso obligatorio.

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 funcionará. Puede personalizarlo si lo necesita. Este enlace le dará una idea de cómo funciona LayoutManager.


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


En mi caso tuve esta estructura

<ScrollView> <RelativeLayout> <android.support.v7.widget.RecyclerView/> </RelativeLayout> </ScrollView>

resolví el problema eliminar Relativo

<ScrollView> <android.support.v7.widget.RecyclerView/> </ScrollView>


En mi caso, estaba usando Fragmento-> ViewPager y Tablayout -> Elemento de visores internos. Usé RecyclerView.

Entonces, en lugar de llamar a ViewPagerAdapter (getChildFragmentManager ()) , estaba llamando a ViewPagerAdapter (getSupportFragmentManager ()), es por eso que no se llama a ninguno de mis elementos de adaptador de reciclador.

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

ViewPagerAdapter (getChildFragmentManager ())


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 para recyclerView

recycler.setLayoutManager(new LinearLayoutManager(this));

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


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

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.


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

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

Espero eso ayude :)