tutorial recyclerview poner implement dentro cardview card and java android android-fragments android-recyclerview

java - poner - RecyclerView no llama a onCreateViewHolder o onBindView



recyclerview fragment kotlin (18)

En mi caso, configuré la ID de mi RecyclerView en "recyclerView". Parece que esta ID ya estaba definida en alguna parte, porque cuando cambié eso a una ID diferente, los métodos del adaptador se llamaron correctamente.

Enlace a la respuesta

No aparece ningún error y todos los datos parecen válidos. Por alguna razón, no se llama a ninguno de los métodos relacionados con la vista. Me he asegurado de lo siguiente:

  • getItemCount () es el único método de adaptador que se llama y está devolviendo un valor entero positivo (sé que esta será el área que verán)

    • Se llama al constructor, las variables miembro son válidas.

    • La vista principal es un diseño lineal lineal; sin vista de desplazamiento, o cualquier otra vista con sus propias propiedades de desplazamiento a la vista.

    • La vista de fragmento que contiene se crea y se muestra en la pantalla.

Aquí está la declaración en el fragmento seguido por el adaptador. Cualquier ayuda sería apreciada ya que esto ha sido completamente desconcertado.

SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(adapter);

public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> { private static final String TAG = String.format("==> %S", SubMenuAdapter.class.getSimpleName()); private final List<ContentItem> mContentItems; private Context mContext; public SubMenuAdapter(Context context, List<ContentItem> contenItems) { Log.d(TAG, "Constructor called"); mContentItems = contenItems; mContext = context; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.d(TAG, "onCreateViewHolder called"); View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_resource_efficiency, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { Log.d(TAG, "onBindViewHolder called"); ContentItem item = mContentItems.get(position); holder.textName.setText(item.getName()); FontSetter.setMyriadProRegular(mContext, holder.textName); Picasso.with(mContext).load("file://" + item.getPreviewImageDefault()).into(holder.imageIcon); } @Override public int getItemCount() { Log.d(mContext, String.format("getItemCount: %d", mContentItems.size())); return mContentItems.size(); } // ViewHolder public static class ViewHolder extends RecyclerView.ViewHolder { TextView textName; ImageView imageIcon; public ViewHolder(View view) { super(view); textName = (TextView) view.findViewById(R.id.tv_resource_efficiency_option); imageIcon = (ImageView) view.findViewById(R.id.iv_resource_efficiency_icon); } }


Al implementar FirebaseListAdapter, uno debe ocuparse de los siguientes puntos para configurarlo correctamente.

  1. Compruebe si recyclerview en xml tiene todos los atributos correctos. No use contenido de ajuste para altura y ancho, por ejemplo.
  2. Compruebe si se configura layoutManager y se atiende setHasFixedSize ().
  3. Haga variables de clase POJO para que coincidan con los atributos secundarios de Firebase.
  4. FirebaseRecyclerOptions está configurado.
  5. FirebaseRecyclerAdapter''s onCreateViewHolder () y onBindViewHolder están ahí.
  6. Los eventos del ciclo de vida son atendidos.

Nota: el uso de wrap_content como altura de la vista de reciclado es uno de los errores más fáciles que cualquiera puede cometer. Así que verifique eso primero.


Asegúrese de que la vista de reciclaje no es hija de nestedscrollview

Por ejemplo, este código no funcionará.

<android.support.v4.widget.NestedScrollView android:id="@+id/responder_scroll" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/darkGray" android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" app:cardElevation="@dimen/spacing_medium" app:cardUseCompatPadding="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/responder_testimonial" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:text="Testimonial" android:textSize="@dimen/general_font_size" /> <TextView android:id="@+id/responder_counter_testimonial" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/responder_testimonial" android:text="170" android:textSize="@dimen/general_font_size_small" /> <Button android:id="@+id/responder_btn_testimonial" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="Go" /> <view android:id="@+id/responder_list_testimonial" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/responder_testimonial" class="android.support.v7.widget.RecyclerView"/> </RelativeLayout> </android.support.v7.widget.CardView> </FrameLayout> </android.support.v4.widget.NestedScrollView>

entonces yo uso,

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <view android:id="@+id/responder_list_testimonial" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/responder_testimonial" class="android.support.v7.widget.RecyclerView"/>


En mi caso estaba usando setHasStableIds (true); en el adaptador mientras algunos elementos de la lista devolvían -1 en getItemID (), por lo que supongo que RecyclerView pensaba que son iguales.


En mi caso, después de cambiar Activity a ViewModel y usar Binding, me había olvidado de eliminar setContentView del método onCreate . Al eliminarlo, mi problema se resolvió.


En mi caso, tuve un Fragment with RecyclerView dentro de un ViewPager . El problema apareció porque usé Fragment.getFragmentManager() lugar de Fragment.getChildFragmentManager para el constructor de mi FragmentStatePagerAdapter .

PS El uso de Layout Inspector puede ser de gran ayuda para depurar este tipo de problemas.


Esto también puede ayudar a alguien

Primer uso

recyclerView.setAdapter(adapter);

Y entonces:

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

Entonces se verá así:

recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

El orden se invierte


Esto ya es realmente antiguo, pero en mi caso, estaba usando un ConstraintLayout y la altura estaba configurada de manera incorrecta, por lo que mi vista tendría 0dp y luego el adaptador estaría guardando para hacer su trabajo, ya que la vista es 0dp.

Asegúrese de que la altura y el ancho RecyclerView bien y que RecyclerView tenga un tamaño positivo.


He estado persiguiendo la respuesta por más de una hora.

No olvide llamar a este revestimiento antes de configurar su adaptador.

recyclerView.setLayoutManager(new LinearLayoutManager(this));

Parece que la vista del reciclador no tiene una opción de administrador de diseño predeterminada incorporada, por lo que tenemos que agregarla programáticamente.

Saludos si lo encontraste útil.


Mis dos centavos aquí. Acabo de pasar más de tres horas depurando esto.

Asegúrese de no haber usado la siguiente línea descuidadamente.

recyclerView.setHasFixedSize(true);

Establezca el tamaño fijo solo cuando esté seguro de que la vista tendrá un tamaño constante. En caso de que no sea así, es posible que no se llame a los métodos onCreateViewHolder y onBindView.


No sé si esto será útil para alguien, pero casi tuve el mismo problema exacto. Mi problema no estaba ni en el fragmento / clase ni en el adaptador de reciclador. El problema estaba en el diseño XML principal, donde la barra de acción tomaba match_parent donde FrameLayout en el que se reemplaza el fragmento, no tenía ningún lugar disponible para mostrar. Por eso no se llamaron los métodos.

Supongo que escenarios similares podrían ser el caso para aquellos que enfrentan el mismo problema. Verifique que cada ancho y alto en cada archivo XML pueda estar en el mismo árbol, ya que el problema no parece estar en el adaptador.


Recientemente me encontré con este problema y aparentemente hay muchas causas posibles. Pruebe una o una combinación de estas opciones, vea cuál (es) trabaja (s) para usted :)

1. Gerente de diseño
Asegúrese de configurar un administrador de diseño para su vista de reciclador como se muestra a continuación

// create a layout manager LinearLayoutManager linearLayoutManager = new LinearLayoutManager(my_context); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); // get recycler view RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id); // set recyclerView.setLayoutManager(linearLayoutManager);

2. Tamaño fijo
Asegúrese de indicar si su vista de reciclador tiene un tamaño fijo o no

// set fixed size recyclerView.setHasFixedSize(true); // or false depending on implementation

3. XML
Asegúrese de que su reciclador no esté anidado en demasiados diseños que pueden causar confusión, como la combinación de ScrollView y RelativeLayout. Hazlo simple, mira si soluciona tu problema

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/thread_list" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>


Sé que este tema es antiguo, pero si cometió el mismo error de aprendizaje, como yo, podría encontrarlo útil.

Mientras estudiaba en algún sitio web sobre RecyclerView y copiaba algo de código y me adaptaba a mi contexto, creé diferentes variables (por ejemplo, usuarios y datos) que estaban destinadas a hacer lo mismo, excepto que algunos métodos llamaban a datos y algunos llamaban a los usuarios . Este es un error fácil de hacer cuando intentas comprender el código de otros y la funcionalidad de Java (me pasa todo el tiempo).

Es bueno saber que puede imprimir en su consola en cualquier parte de su código java, por lo que puede depurar así con bastante facilidad.

¡Buena suerte!


Si coloca wrap_content como altura de su lista, así como la altura de su lista de elementos, no aparecerá nada y no se llamará a ninguna de sus funciones de recyclerView.


También tuve el mismo problema en el que onCreateViewHolder onBindView método onCreateViewHolder o onBindView , solo se invocaba getItemCount . Entonces, básicamente fue un problema con la altura y el peso de RecyclerView que se configuró en wrap_content o 0dp . Después de cambiarlo a algún valor, se solucionó el problema.


Tenga cuidado con el hilo con el que está trabajando el adaptador.
En mi caso, el problema era llamar a notifyDataSetChanged() desde una actividad cuando mis datos provenían de un servicio. En realidad, el método estaba llamando desde el hilo de fondo. Pero la aplicación no se bloqueó y no había nada en Logcat (!).
Entonces me llamaron notifyDataSetChanged() en el hilo de la interfaz de usuario y el problema se resolvió.

runOnUiThread(new Runnable() { @Override public void run() { adapter.notifyDataSetChanged(); } });


Tuve este mismo problema donde no se llamaba a onCreateViewHolder ni a onBindViewHolder. Cambiar su método onCreateViewHolder para usar el contexto en el que guardó una referencia en el constructor en lugar de hacer parent.getContext () debería solucionarlo:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.d(TAG, "onCreateViewHolder called"); View view = LayoutInflater.from(mContext).inflate(R.layout.row_resource_efficiency, parent, false); return new ViewHolder(view);


si está utilizando el diseño de restricción cuando está configurado la altura de la vista de reciclador para que coincida con el padre (0), se produce este problema