Saltar al contenido

¿Cómo mostrar un ArrayList en un RecyclerView?

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 RecyclerViews – 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 un TextView)

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *