Te damos la bienvenida a nuestro espacio, ahora vas a encontrar la resolución de lo que necesitas.
Solución:
Recuerdo cuando leí por primera vez sobre RecyclerView
s – Estoy de acuerdo en que puede ser un poco confuso al principio. Con suerte, esta explicación le ayudará a comprenderlo mejor.
Conceptos básicos de RecyclerView
1. Agregar el RecyclerView
Primero necesitas agregar tu RecyclerView
a su diseño XML. Supongo que sabes cómo hacer esto. También lo declaras en tu código Java:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
2. Creando el Adapter
y entendimiento ViewHolder
A continuación, debe crear un Adapter
para ello. Esta es una clase que implementa RecyclerView.Adapter
. Explicaré lo que esto significa en un minuto.
Creo que ayuda ver un ejemplo de Adapter
para entender cómo funciona (por ejemplo, uno que creé para una aplicación de código abierto). También recomendaría encarecidamente mirar un conjunto de archivos Java que hice como ejemplo en Gist en GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
Haré referencia a los archivos de ejemplo del enlace anterior en esta explicación para que pueda seguirlos.
Puedes ver que el Adapter
La clase contiene una clase interna, que es tu ViewHolder
. Por lo tanto, necesita extender RecyclerView.ViewHolder
.
Dentro de esto ViewHolder
, declaras las variables para los diseños que se utilizarán para cada elemento de la lista en tu RecyclerView
. En el constructor de tu ViewHolder
, asigna estas variables. Me refiero a esta parte del código (doy mi ejemplo a continuación):
ExampleViewHolder(View itemView)
super(itemView);
text1 = (TextView) itemView.findViewById(R.id.text1);
text2 = (TextView) itemView.findViewById(R.id.text2);
Eso es todo lo que necesitas para tu ViewHolder
(la clase interior en tu Adapter
).
3. Comprensión de Adapter
Como la mayoría de los objetos Java, necesitará tener un constructor de algunas variables privadas en su Adapter
clase. Aquí están los míos:
private ArrayList mCustomObjects;
public ExampleAdapter(ArrayList arrayList)
mCustomObjects = arrayList;
Necesitarás tener tu ArrayList
como un parámetro de constructor para que pueda pasar la lista para que su Adapter
puede usarlo.
Si miras el resto de la Adapter
class, contiene algunos métodos que anula de lo que extiende. Echemos un vistazo rápido a cuáles son:
getItemCount()
devuelve el tamaño de su lista.onCreateViewHolder(...)
se utiliza para inflar el diseño de su elemento de lista.onBindViewHolder(...)
configura sus diseños para el elemento de la lista (por ejemplo, configurando el texto a unTextView
)
En la mayoría de los casos, getItemCount()
solo devolverá el size()
de tu ArrayList
.
los onCreateViewHolder(...)
El método generalmente también permanece igual:
@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2, parent, false);
return new ExampleViewHolder(view);
Puede ver que estoy inflando el diseño que usaré como elemento de mi lista (android.R.layout.simple_list_item_2
). Este diseño está integrado en Android, por lo que no necesito crearlo; por supuesto, puede usar el diseño que desee y luego modificar su Adapter
para los widgets que pueda estar usando. El tipo de retorno de este método coincidirá con lo que haya nombrado su ViewHolder
clase interior.
Ahora, lo interesante está en onBindViewHolder(...)
. Usted configura sus diseños aquí, por lo que depende completamente de usted lo que quiera hacer. Aquí hay una plantilla que puede usar:
@Override
public void onBindViewHolder(ExampleViewHolder holder, int position)
CustomClass object = mCustomObjects.get(position);
String firstText = object.getFirstText()
String secondText = object.getSecondText()
holder.text1.setText(firstText);
holder.text2.setText(secondText);
Básicamente, accedes a tu ViewHolder
variables (para los widgets en el diseño de elementos de su lista) haciendo holder.myWidget
. los holder
parte proviene del parámetro, que es su ViewHolder
de lo que hablamos antes, y myWidget
sería el nombre del View
variable de eso.
En el ejemplo anterior, el object
tiene un getFirstText()
método, y el ViewHolder
contiene una TextView
(text1
), por lo que estoy configurando el texto.
También hay un método más: onAttachedToRecyclerView(...)
. Puede usar esto para cosas más complejas, pero en un nivel básico, generalmente es esto:
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
super.onAttachedToRecyclerView(recyclerView);
4. Configuración RecyclerView
Recuerde al principio, cuando declaramos y asignamos nuestro RecyclerView
?:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
Ahora lo vamos a configurar.
Empiece por configurar un “administrador de diseño”. Esto determina cómo se mostrará cada elemento de la lista en la pantalla. Los comunes son LinearLayoutManager
y GridLayoutManager
. El primero coloca los elementos de su lista en una lista estándar (nada especial en realidad, pero es muy útil), y el segundo organiza los elementos de su lista en un tipo de diseño de cuadrícula.
En nuestro ejemplo, usaremos un LinearLayoutManager
. Para configurar esto en el RecyclerView
, nosotros hacemos esto:
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Eso es todo.
Y todo lo que tenemos que hacer a continuación es configurar el Adapter
clase que creamos y personalizamos antes para su RecyclerView
:
ExampleAdapter adapter = new ExampleAdapter(yourCustomArrayList);
recyclerView.setAdapter(adapter);
En lo anterior, estoy asumiendo tu adapter
solo tiene un parámetro, pero esto dependerá de cómo lo hayas configurado anteriormente.
5. Usando su RecyclerView
Los pasos anteriores deberían darle un trabajo RecyclerView
. Si te quedas atascado, puedes ver cómo agregué uno a mi aplicación aquí.
También puede consultar las muestras de Google para RecyclerView
implementación.
Espero que todo esto te haya dado una idea clara de cómo RecyclerView
obras.
Agregar un oyente de clics
Es posible que desee agregar un detector de clics para que no esté utilizando el RecyclerView
solo para mostrar artículos.
Para hacer esto, tu interior ViewHolder
la clase necesita implementar View.OnClickListener
. Esto se debe a que establecerá un OnClickListener
al itemView
parámetro de la ViewHolder
constructor de. Déjame mostrarte lo que quiero decir:
public class ExampleClickViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
TextView text1, text2;
ExampleClickViewHolder(View itemView)
super(itemView);
// we do this because we want to check when an item has been clicked:
itemView.setOnClickListener(this);
// now, like before, we assign our View variables
title = (TextView) itemView.findViewById(R.id.text1);
subtitle = (TextView) itemView.findViewById(R.id.text2);
@Override
public void onClick(View v)
// The user may not set a click listener for list items, in which case our listener
// will be null, so we need to check for this
if (mOnEntryClickListener != null)
mOnEntryClickListener.onEntryClick(v, getLayoutPosition());
Las únicas otras cosas que necesita agregar son una interfaz personalizada para su Adapter
y un método setter:
private OnEntryClickListener mOnEntryClickListener;
public interface OnEntryClickListener
void onEntryClick(View view, int position);
public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener)
mOnEntryClickListener = onEntryClickListener;
Así que su nuevo soporte para clics Adapter
Esta completo.
Ahora, usémoslo …
ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener()
@Override
public void onEntryClick(View view, int position)
// stuff that will happen when a list item is clicked
);
recyclerView.setAdapter(clickAdapter);
Básicamente, es la forma en que configuraría un Adapter
, excepto que usa su método de establecimiento que creó para controlar lo que hará cuando su usuario haga clic en un elemento de la lista en particular.
Para reiterar, puede ver un conjunto de ejemplos que hice en este Gist en GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
Aquí hay un ejemplo de trabajo, espero que te ayude:
public class BankListAdapter extends RecyclerView.Adapter
ArrayList bankListModels;
FragmentActivity activity;
View selectBank;
public BankListAdapter(ArrayList bankListModels, FragmentActivity activity)
this.bankListModels=bankListModels;
this.activity=activity;
@Override
public BankListViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View bankListLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_bank_list, null);
BankListViewHolder bankListViewHolder = new BankListViewHolder(bankListLayout);
return bankListViewHolder;
@Override
public void onBindViewHolder(BankListViewHolder holder, int position)
holder.bankName.setText(bankListModels.get(position).getBankName());
@Override
public int getItemCount()
return bankListModels.size();
public class BankListViewHolder extends RecyclerView.ViewHolder
TextView bankName;
public BankListViewHolder(View itemView)
super(itemView);
bankName = (TextView) itemView.findViewById(R.id.tv_bankName);
selectBank = itemView.findViewById(R.id.cv_selectBank);
Sección de Reseñas y Valoraciones
Agradecemos que desees favorecer nuestro quehacer añadiendo un comentario y dejando una puntuación te estamos eternamente agradecidos.