Recyclerview no llama a onCreateViewHolder


150

Mi RecyclerViewno llama onCreateViewHolder, onBindViewHolderincluso MenuViewHolderconstructor, por lo tanto, no aparece nada RecyclerView. Pongo registros para la depuración, y no se muestra ningún registro. ¿Cuál podría ser el problema?

Mi adaptador:

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
private LayoutInflater inflater;
List<Menu> data = Collections.emptyList();

public MenuAdapter(Context context, List<Menu> data) {
    Log.i("DEBUG", "Constructor");
    inflater = LayoutInflater.from(context);
    Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toString());
    this.data = data;
    for(Menu menu: this.data){
        Log.i("DEBUG MENU - CONSTRUCTOR", menu.menu);
    }
}

@Override
public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.row_menu, parent, false);
    MenuViewHolder holder = new MenuViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
    Log.i("DEBUG MENU", "onBindViewHolder");
    Menu current = data.get(position);
    holder.title.setText(current.menu);
}

@Override
public int getItemCount() {
    return 0;
}

class MenuViewHolder extends RecyclerView.ViewHolder {
    TextView title;
    ImageView icon;

    public MenuViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.menuText);
    }
}

Mi fila personalizada XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/menuText"
    android:text="Dummy Text"
    android:layout_gravity="center_vertical"
    android:textColor="#222"/>

y mi fragmento:

public NavigationFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
    if (savedInstanceState != null) {
        mFromSavedInstaceState = true;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_navigation, container, false);
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.drawer_list);
    MenuAdapter adapter = new MenuAdapter(getActivity(), getData());
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setAdapter(adapter);
    return view;
}

por qué configuras recyclerView.setAdapter (adaptador); ¿2 veces?
Panayiotis Irakleous

Otra causa de este problema es hacer que el diseño del elemento coincida erróneamente con la altura del elemento primario, por lo que solo se muestra un elemento a la vez.
Joe Lapp

En mi caso ayuda esto: invoicesRecyclerView.setHasFixedSize (true) invoicesRecyclerView.setLayoutManager (GridLayoutManager (this, 1))
a_subscriber

Respuestas:


239

Su getItemCountmétodo returns 0. Así que RecyclerViewnunca intenta crear una vista de instancia. Haz que devuelva algo greater than 0.

por ejemplo

@Override
public int getItemCount() {
    return data.size();
}

25
¡Dios mío, me siento tan tonta en este momento! : facepalm: ¡Gracias por esto!
Shinta S

3
Acabo de perder una hora para esto porque getItemCount estaba muy por debajo de todos los demás códigos y no lo vi. : |
Joel

Tenía un adaptador personalizado y me había olvidado de configurar mi cuenta de artículos al tamaño de mi colección
Dooie

3
mi recuento de elementos es 3 todavía no visible, no hay puntos de depuración en onBind o onCreateHolder ... pero viene en getItemCount
Dr. aNdRO

¡Oh hombre! Yo también estaba luchando con esto para descubrir por qué diablos mi punto de ruptura no está llegando y ahora lo sé ... ¡LOL! ¡¡¡MALDICIÓN!!! ¡GRACIAS!
Vincy

409

Otra es asegurarse de configurar el administrador de diseño en RecyclerView:

recycler.setLayoutManager(new LinearLayoutManager(this));

2
Vuelvo a esta respuesta muuuuuuuuy seguido ...
finki


15

Esto no aplica para su caso particular. Pero esto podría ayudar a alguien más.

Esta razón podría ser el uso descuidado del siguiente método

recyclerView.setHasFixedSize(true);

Si no se utiliza con precaución, esto podría hacer que el onBindViewy onCreateViewHolderque no fuese llamado en absoluto, sin error en los registros.


12

Configure el administrador de diseño para que le RecyclerViewguste el siguiente código:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

9

Por lo que vale, lo observé cuando configuré el adaptador de vista del reciclador antes de que el adaptador se inicializara realmente. La solución fue asegurarse de que recyclerView.setAdapter(adapter)se llamara con un adaptador no nulo


9

Realmente realmente espero que esto ayude a alguien algún día. ¡Acabo de pasar más de una hora para que este se vuelva loco!

Tuve esto:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

Cuando debería haber tenido esto:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

Como llamé tontamente a mi adaptador adapter, ¡el adaptador de la vista del reciclador lo estaba ocultando en el bloque de aplicación! ¡Cambié el nombre del adaptador a projectAdapter para diferenciarlo y resolver el problema!


6

Establecer la altura de la TextViewen custom.xmlo RecyclerView. Si la altura es wrap-content, la RecyclerViewno será visible.


Pasé mucho tiempo en esto ... la altura de la vista del reciclador era cero. Cuando se usa en una actividad, de alguna manera se expande. En un fragmento dentro de otros diseños ... no fue así
Asif Shiraz

4

Esto sucedió cuando RecyclerViewestaba dentro de ScrollVieway estaba usando Android Support Library 23.0. Para solucionarlo, actualicé a la Biblioteca de soporte de Android 23.2:

En build.gradle:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}

4

Agregue esto a su clase de adaptador

 @Override
    public int getItemCount() {
        return mDataset.size();
    } 

también, es un duplicado
Ricardo A.

4

Tal vez ayude a alguien, pero si configura la visibilidad de su RecycleView en GONE, los métodos del adaptador no se llamarán en absoluto ... Me tomó algo de tiempo resolverlo.


increíble !!! ... tanques tan ,,,
X-Black ...

3

Tuve el mismo problema, porque estaba usando android.support.constraint.ConstraintLayoutrecursos de diseño. Cambiando a FrameLayoutayudado.


Gracias por tu solución. ¿Alguna idea de por qué se comporta así si la vista principal es android.support.constraint.ConstraintLayout?
Adrian Buciuman

2

Otra opción es si envía este objeto de lista usando get, verifique si tiene la referencia correcta, por ejemplo

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}

2

Luché con este problema durante muchas horas. Estaba usando un fragmento. Y el problema no era devolver el view. Debajo está mi código:

ProductGridBinding binding = DataBindingUtil.inflate( inflater, R.layout.product_grid, container, false);



    mLinearLayoutManager = new LinearLayoutManager(getActivity());
    mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    binding.rvNumbers.setHasFixedSize(true);
    binding.rvNumbers.setLayoutManager(mLinearLayoutManager);
    binding.rvNumbers.setAdapter(adapter);


    View view = binding.getRoot();


    return view;

Código extraño Estas variables y clases son difíciles de entender.
CoolMind

2

Vea mi respuesta si está utilizando la biblioteca de enlace de datos de Android: asegúrese de establecer el diseño para la vista de reciclaje y el recuento de elementos debe ser mayor que 0

 @BindingAdapter({"entries", "layout"})
    public static void setEntries(RecyclerView view, ArrayList<LoginResponse.User> listOfUsers, int layoutId) {
        if (view.getAdapter() == null) {
            view.setLayoutManager(new LinearLayoutManager(view.getContext()));
            SingleLayoutAdapter adapter = new SingleLayoutAdapter(layoutId) {
                @Override
                protected Object getObjForPosition(int position) {

                    return listOfUsers.get(position);
                }

                @Override
                public int getItemCount() {
                    return listOfUsers.size();
                }
            };
            view.setAdapter(adapter);
        }
    }

Feliz codificación :-)


1

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.


1

Si usa un adaptador personalizado, no olvide establecer el ItemCount al tamaño de su colección.


1

En mi caso, el tamaño de mi lista era 0 y no estaba llamando al método onCreateViewHolder. Necesitaba mostrar un mensaje en el centro de la lista vacía como marcador de posición, así que lo hice así y funcionó a las mil maravillas. Respuesta de @Konstantin Burov ayudó.

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}

Esta no es una muy buena idea. Es mejor establecer la visibilidad del mensaje vacío al colocar datos en el adaptador.
El increíble Jan

1

Mi estímulo fue el método anulado onBindViewHolder (titular, posición) del RecyclerView.adaptor que no se llama. Se llamó al método onCreateViewHolder, se llamó a getItemCount. Si lee las especificaciones del Adaptador Recyclerview, sabrá que si ha anulado onBindViewHolder (titular, posición, Lista de cargas) se le llamará a favor. Así que por favor ten cuidado.


¿Cómo resolviste un problema de no llamar onBindViewHolder?
CoolMind

1

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. Arregle la altura del elemento o ponga match_parent para la altura de la lista. Eso resolvió mi problema.


1

Mi error fue inflar la vista incorrecta en Fragment onCreateView.



0

Por favor haz lo siguiente

@Override
public int getItemCount() {
    return data.size();
}

0

En mi caso, después de cambiar la Actividad para usar ViewModel y DataBinding, se me había olvidado eliminar la setContentViewllamada al onCreatemétodo del método. Al eliminarlo, mi problema se resolvió.


0

Para mí, fue porque setHasStableIds (true); Se estableció el método. Elimina eso y funcionará


Pero este método no parece estar en el ejemplo mínimo reproducible en la pregunta. Si eliminar esta sugerencia soluciona algo, probablemente sea una indicación de un error en la implementación del titular de la vista o tal vez el notificador.

0

recyclerView.setAdapter (adaptador); llamado La lista recyclerView se completa llamando al método.


0

Asegúrese de que su XMLy Koltin/Javacódigo de registro. En mi caso, tuve un problema con el ViewHolderya que había escrito:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

Pero como mi código XML es:

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

Tuve que cambiar la fila privada en:

var txt: TextView = itemView.findViewById(R.id.txt)

Además, también tuve que eliminar:

recyclerView.setHasFixedSize(true);

Espero que esto pueda ayudarte :)


0

En mi caso, me faltaba llamar notifyDataSetChanged()después de configurar la lista en el adaptador.

public void setUserList(List<UserList> userList) {
      this.userList = userList;
        notifyDataSetChanged();
}

0

En mi caso, pierdo establecer la orientación en mi LinearLayout.

Después de agregar el problema de orientación solucionado.

 android:orientation="vertical"

0

Mi problema era layout_heighty layout_widthdel RecyclerView configurado en 0dp.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.