tutorial studio recyclerview make how ejemplo create java android android-recyclerview

java - make - recyclerview android studio ejemplo



Recyclerview no llama a onCreateViewHolder (26)

Mi RecyclerView no llama a onCreateViewHolder , onBindViewHolder ni MenuViewHolder constructor MenuViewHolder , por lo tanto, nada aparece en RecyclerView . Puse 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; }


Agregue esto a su clase de adaptador

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;


Configure el administrador de diseño en RecyclerView como se muestra a continuación:

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));


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.


En mi caso, después de cambiar la Actividad para usar ViewModel y DataBinding, me olvidé de eliminar el método setContentView llamando onCreate método onCreate . Al eliminarlo, mi problema se resolvió.


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ó.

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


Establecer la altura de TextView en custom.xml o RecyclerView . Si la altura es wrap-content RecyclerView , RecyclerView no será visible.


Esto no se aplica a 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 usa con precaución, esto podría provocar que no se llame a onBindView y onCreateViewHolder , sin ningún error en los registros.


Esto sucedió cuando mi RecyclerView estaba dentro de un ScrollView y 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.+'' }


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

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


Mi error fue inflar la vista incorrecta en Fragment onCreateView.


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.


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

recycler.setLayoutManager(new LinearLayoutManager(this));


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

@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); } }


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


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


Por favor haz lo siguiente

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


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.


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


Su método getItemCount returns 0 . Por lo tanto, RecyclerView nunca intenta crear una vista de instancia. Haz que devuelva algo greater than 0 .

por ejemplo

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


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.


Tuve el mismo problema, porque estaba usando android.support.constraint.ConstraintLayout en el recurso de diseño. Cambiar a FrameLayout ayudó.


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

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

Feliz codificación :-)


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

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


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


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!


Realmente espero que esto ayude a alguien algún día. ¡Acabo de pasar más de una hora en esto volviendo loco!

Tuve esto:

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

Cuando debería haber tenido esto:

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

¡Como llamé tontamente a mi adaptador adapter , el adapter 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!