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.
- Compruebe si recyclerview en xml tiene todos los atributos correctos. No use contenido de ajuste para altura y ancho, por ejemplo.
- Compruebe si se configura layoutManager y se atiende setHasFixedSize ().
- Haga variables de clase POJO para que coincidan con los atributos secundarios de Firebase.
- FirebaseRecyclerOptions está configurado.
- FirebaseRecyclerAdapter''s onCreateViewHolder () y onBindViewHolder están ahí.
- 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