[JAVA] [Android] Implémentation de ListView à défilement latéral à l'aide de RecyclerView

Ce que j'ai fait

ListView est familier sur Android, mais il ne peut pas faire défiler horizontalement. Par conséquent, nous allons créer un widget comme ListView qui hérite de RecyclerView et défile horizontalement.

Qu'est-ce que RecyclerView?

Un widget qui affiche joliment plusieurs vues. C'est assez flexible, donc la plupart des choses peuvent être faites avec cela. Pour plus de détails, voir [Android] Implémentation de base de RecyclerView.

Produit fini

HorizontalListView.java



import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

public class HorizontalListView extends RecyclerView{

    public interface OnItemClickListener{
        void onItemClick(View view, int position);
    }

    public HorizontalListView(Context context){
        super(context);
        initialize(context);
    }

    public HorizontalListView(Context context, AttributeSet set){
        super(context, set);
        initialize(context);
    }

    public HorizontalListView(Context context, AttributeSet set, int defaultAttr){
        super(context, set, defaultAttr);
        initialize(context);
    }

    private void initialize(Context context){
        LinearLayoutManager manager = new LinearLayoutManager(context);
        manager.setOrientation(LinearLayoutManager.HORIZONTAL);
        setLayoutManager(manager);
    }

    private OnItemClickListener mListener;

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
        Adapter adapter = getAdapter();
        if ( adapter instanceof ArrayAdapter ){
            ArrayAdapter a = (ArrayAdapter)adapter;
            a.mListener = this.mListener;
        }
    }

    @Override
    public void setAdapter(RecyclerView.Adapter adapter){
        super.setAdapter(adapter);
        if ( adapter instanceof ArrayAdapter ){
            ArrayAdapter a = (ArrayAdapter)adapter;
            a.mListener = this.mListener;
        }
    }

    @Override
    protected void onDetachedFromWindow(){
        super.onDetachedFromWindow();
        setOnItemClickListener(null);
        setAdapter(null);
        setLayoutManager(null);
    }

    private static class SimpleViewHolder extends ViewHolder{
        private SimpleViewHolder(View view){
            super(view);
        }
    }

    public static abstract class ArrayAdapter<E> extends RecyclerView.Adapter<ViewHolder> {

        public ArrayAdapter(List<E> list){
            mDataList = new ArrayList<>(list.size());
            mViews = new ArrayList<>(list.size());
            mDataList.addAll(list);
        }

        private List<E> mDataList;
        private OnItemClickListener mListener;
        private List<View> mViews;

        /**
         *Instancier la vue en tant qu'élément de liste
         * @param parent
         * @return null not acceptable
         */
        public abstract View getView(ViewGroup parent);

        /**
         *Refléter les données affichées dans la liste dans View
         * @vue param Vue de la destination de réflexion
         * @param data Données à refléter{@link #getItem(int)}Mais peut être obtenu
         * @param position Position sur la liste
         */
        public abstract void onBindView(View view, E data, int position);

        @Override
        public final ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
            return new SimpleViewHolder(getView(parent));

        }

        @Override
        public final void onBindViewHolder(final ViewHolder holder, int position){

            final View view = holder.itemView;
            E data = getItem(position);
            onBindView(view, data, position);

            mViews.add(holder.itemView);
            holder.itemView.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v){
                    if ( mListener != null ){
                        mListener.onItemClick(view, holder.getAdapterPosition());
                    }
                }
            });
        }

        @Override
        public void onDetachedFromRecyclerView(RecyclerView recyclerView){
            super.onDetachedFromRecyclerView(recyclerView);
            for ( View view : mViews ) view.setOnClickListener(null);
            mViews = null;
            mListener = null;
            mDataList = null;
        }

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

        public E getItem(int position){
            return mDataList.get(position);
        }
    }
}

Description de la mise en œuvre

Réalisation de scrolling horizontal

Tout ce que vous avez à faire est de définir LinearLayoutManager avec l'orientation horizontale sur RecyclerView.

private void initialize(Context context){
    LinearLayoutManager manager = new LinearLayoutManager(context);
    manager.setOrientation(LinearLayoutManager.HORIZONTAL);
    setLayoutManager(manager);
}

Préparation de l'adaptateur

Comme ListView, RecyclerView nécessite un adaptateur pour gérer les données et la vue à afficher. Par conséquent, nous avons préparé HorizontalListView.ArrayAdapter en héritant de RecyclerView.Adapter. Les deux suivants doivent être implémentés lors de l'utilisation.

    public abstract View getView(ViewGroup parent);

    public abstract void onBindView(View view, E data, int position);

Gonflez la vue utilisée pour l'affichage avec getView (ViewGroup) et reflétez le contenu des données E pour afficher avec onBindView (View, E, int). Lors de l'utilisation de ListView, je lui ai donné une API similaire afin qu'elle puisse être utilisée de la même manière que la personnalisation de la mise en page avec un adaptateur qui hérite de android.widget.ArrayAdapter.

Préparation du rappel

Comme ListView, je veux un rappel qui me prévient lorsqu'un élément de la liste est cliqué. Faisons-le.

public interface OnItemClickListener{
    void onItemClick(View view, int position);
}

Notifie la vue et la position d'affichage cliquées. En tant qu'implémentation, définissez OnClickListener sur la vue que l'HorizontalListView.ArrayAdapter créée précédemment acquiert et affiche avec getView (ViewGroup) et relaie le rappel reçu. Cependant, notez que cela ne fonctionnera que si l'adaptateur défini avec RecyclerView # setAdapter () est HorizontalListView.ArrayAdapter.

Recommended Posts

[Android] Implémentation de ListView à défilement latéral à l'aide de RecyclerView
Implémentation facile de la navigation de fichiers Android
Implémentation de la validation à l'aide d'expressions régulières
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (2)
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (1)
Implémentation des onglets à l'aide de TabLayout et ViewPager
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (3)
[Rails] Implémentation de la fonction de recherche en utilisant le ransack de gem
Code de modèle minimal pour le développement Android, implémentation de RecyclerView
[Android] [Java] Gérer l'état de CheckBox de ListView
[FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot
[Rails] Implémentation de la fonction d'agrandissement d'image à l'aide de lightbox2
Traduire à l'aide de l'API Microsoft Translator Text sur Android ~ Implémentation ~
[Rails] Mise en œuvre du classement des nombres PV à l'aide de l'impressionniste
[Rails] Implémentation du diaporama d'images à l'aide de Bootstrap 3
Histoire de l'automatisation des tests avec Appium [Android / java]
Mise en œuvre de Google Sign-In à l'aide de l'authentification Google OAuth 2.0 (édition serveur)
[Android] Affichage des candidats d'entrée à l'aide de la fenêtre contextuelle Liste
<Android> Changer la couleur d'arrière-plan de la ligne Liste de ListView
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "Préparation"
[Rails] Implémentation de la fonction de catégorie multicouche à l'aide de l'ascendance "seed edition"
Implémentation de la fonction de recherche
Exemple d'utilisation de vue.config.js
Implémentation appliquée de l'espace de chat
Résumé de l'utilisation de FragmentArgs
Mise en œuvre de la fonction de pagénation
Résumé de l'utilisation de DBFlow
Implémentation d'une base de données avec Realm
Définition des constantes Android
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "Edit Form Edition"
Comment mettre en œuvre facilement les achats intégrés à l'aide d'itemsstore <Implémentation: Android>
[Rails] Implémentation de la saisie d'adresse automatique avec jpostal et jp_prefecture
[Rails] Implémentation de la fonction de catégorie multicouche à l'aide de l'ascendance "Formulaire de création"