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;
}
Malinosqui
fuente
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();
}
Konstantin Burov
fuente
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));
Lay Leangsros
fuente
2
Vuelvo a esta respuesta muuuuuuuuy seguido ...
finki
42

olvidé agregar la siguiente línea después de agregarla, funcionó para mí

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
Sai Gopi N
fuente
10
¿Cómo esta respuesta es diferente de @Lay Leangsros arriba de una respuesta?
Mehdi Dehghani
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.

venky
fuente
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));
Mandeep Yadav
fuente
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

kip2
fuente
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!

the_new_mr
fuente
6

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

jian lang
fuente
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.+'
}
J Wang
fuente
4

Agregue esto a su clase de adaptador

 @Override
    public int getItemCount() {
        return mDataset.size();
    } 
Brinda Rathod
fuente
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.

linea de quiebre
fuente
increíble !!! ... tanques tan ,,,
X-Black ...
3

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

Peluche salvaje
fuente
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;
}
David Hackro
fuente
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;
TharakaNirmana
fuente
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 :-)

Bajrang Hudda
fuente
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.

Mateusz Wlodarczyk
fuente
1

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

Dooie
fuente
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();
    }
}
SR. X
fuente
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.

Yaojin
fuente
¿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.

Meriam
fuente
1

Mi error fue inflar la vista incorrecta en Fragment onCreateView.

Jeffrey
fuente
1

ve a tu xml. Y cambie su diseño para envolver contenido. ¡El elemento oculta el siguiente, por lo que los métodos no funcionan!

Coala
fuente
1
Bienvenido a StackOverflow @koala !. Vea esto Cómo escribir la buena respuesta aquí stackoverflow.com/help/how-to-answer
Shashin Bhayani
0

Por favor haz lo siguiente

@Override
public int getItemCount() {
    return data.size();
}
Saurav Mir
fuente
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ó.

Siamak Ferdos
fuente
0

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

Catalin
fuente
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.

Mesut Beysülen
fuente
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 :)

Mattia Ferigutti
fuente
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();
}
nkadu1
fuente
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"
Ranjith Kumar
fuente
0

Mi problema era layout_heighty layout_widthdel RecyclerView configurado en 0dp.

Cañas Zezi
fuente