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!