[JAVA] Créer un contrôle de page qui peut être utilisé avec RecyclerView

Qu'est-ce que le contrôle de page?

C'est une pagination en forme de point courante dans iOS. Il n'est pas fourni en standard sur Android, vous devez donc le créer ou utiliser une bibliothèque. page_control.gif Ici, on l'appelle contrôle de page après iOS, mais sous Android, on l'appelle souvent Indicator, et c'est une fameuse bibliothèque <a href"https://github.com/JakeWharton/ViewPagerIndicator"> ViewPageIndicator > Et <a href+"https://github.com/ongakuer/CircleIndicator"> CircleIndicator . Cependant, ces bibliothèques ne pouvaient être utilisées qu'avec ViewPager, j'ai donc créé ma propre vue personnalisée.

Utiliser RecyclerView comme ViewPager

ViewPager dans RecyclerView à l'aide de PagerSnapHelper qui peut être utilisé avec SupportLibrary 25.1.0 ou version ultérieure Vous pouvez obtenir le même comportement. Ceci est utile lorsque vous souhaitez éviter ViewPager dans ViewPager.

MainActivity.java


RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);

PagerSnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);

Si vous ne pouvez pas utiliser PagerSnapHelper en raison de problèmes de version, l'article suivant vous montrera comment créer des snaps. http://qiita.com/hotpepsi/items/1167e5263f048a005e05

Créer un contrôle de page

Faire un point

Il existe deux types, par défaut et sélectionné.

res/drawable/shape_page_control_default.xml


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#FFFFFF" />
</shape>

res/drawable/shape_page_control_selected.xml


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#B7B7B7" />
</shape>

Créer une vue personnalisée

Créez une vue personnalisée qui effectue les deux opérations suivantes:

--Créez autant de points que d'éléments affichés par RecyclerView. ――Lorsque vous capturez, les points basculent également en tandem.

Lors de la commutation de points en conjonction avec l'accrochage, la position de l'élément actuellement capturé est requise, elle est donc acquise à l'aide de `` findLastVisibleItemPosition () '' de LinerLayoutManager.

PageControlView.java


public class PageControlView extends LinearLayout {
    private ImageView[] imageViews;

    public PageControlView(Context context) {
        this(context, null);
    }

    public PageControlView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PageControlView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setRecyclerView(RecyclerView recyclerView, final LinearLayoutManager layoutManager) {
        int itemCount = layoutManager.getItemCount();
        if (itemCount < 1) {
            return;
        }
        createPageControl(itemCount);

        //Changer les points en fonction du défilement de RecyclerView
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int position = layoutManager.findLastVisibleItemPosition();
                int itemCount = layoutManager.getItemCount();

                for (int i = 0; i < itemCount; i++) {
                    imageViews[i].setImageResource(R.drawable.shape_page_control_default);
                }
                imageViews[position].setImageResource(R.drawable.shape_page_control_selected);
            }
        });
    }

  //Créez autant de points qu'il y a d'éléments dans RecyclerView
    private void createPageControl (int itemCount) {
        imageViews = new ImageView[itemCount];

        for (int i = 0; i < imageViews.length; i++) {
            imageViews[i] = new ImageView(getContext());
            imageViews[i].setImageResource(R.drawable.shape_page_control_default);

       //Ajuster la taille et l'espacement des points(L'image gif en haut est 10dp)
            int dotSize = getResources().getDimensionPixelSize(R.dimen.page_control_dot_size);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dotSize, dotSize);
            params.setMargins(dotSize / 2, 0, dotSize / 2, 0);
            imageViews[i].setLayoutParams(params);

            addView(imageViews[i]);
        }
        imageViews[0].setImageResource(R.drawable.shape_page_control_selected);
    }
}

Utiliser la vue personnalisée

Organisez-le comme une vue normale.

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.hogehoge.fugafuga.MainActivity">
    
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <com.hogehoge.fugafuga.PageControlView
        android:id="@+id/page_control_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:layout_gravity="center"/>
</LinearLayout>

MainActivity.java


PageControlView pageControlView = (PageControlView) findViewById(R.id.page_control_view);
pageControlView.setRecyclerView(recyclerView, layoutManager);

prime

Vous pouvez également l'utiliser avec ViewPager en réécrivant la méthode setRecyclerView comme suit. C'est plus facile car l'auditeur a une position.

PageControlView.java


    public void setViewPager (final ViewPager viewPager) {
        int itemCount = viewPager.getAdapter().getCount();

        if (itemCount < 1) {
            return;
        }
        createPageControl(itemCount);

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                int itemCount = viewPager.getAdapter().getCount();

                for (int i = 0; i < itemCount; i++) {
                    imageViews[i].setImageResource(R.drawable.shape_page_control_default);
                }
                imageViews[position].setImageResource(R.drawable.shape_page_control_selected);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

Recommended Posts

Créer un contrôle de page qui peut être utilisé avec RecyclerView
Organiser les méthodes qui peuvent être utilisées avec StringUtils
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
Créez un fichier jar qui peut être exécuté sur Gradle
Base de données Firebase-Realtime sur Android pouvant être utilisée avec copie
J'ai posé une question qui peut être utilisée pour des entretiens techniques
SwiftUI View qui peut être utilisé en combinaison avec d'autres frameworks
Implémentation de machine à sous simple qui peut être utilisée avec copie
Outils d'analyse des performances et de diagnostic des pannes utilisables avec OpenJDK
Méthodes de tableau Ruby pouvant être utilisées avec Rails (autres que chacun)
[OpenJDK11 & JavaFX13] Créez une application javaFX avec IntelliJ + gradle et créez un package qui peut être distribué avec un JRE léger.
J'ai créé un client API THETA qui peut être utilisé pour le développement de plugins
[Affichage message ERREUR] Version simple utilisable à tout moment avec le gabarit partiel des rails
Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard
Plage où les variables peuvent être utilisées avec ruby [Scope]
À propos du problème que hidden_field peut être utilisé de manière insensée
Touches de raccourci pratiques pour Eclipse
Syntaxe et conditions d'occurrence d'exception pouvant être utilisées lors de la comparaison avec null en Java
Quatre rangées avec gravité pouvant être jouées sur la console
Créez une méthode qui peut récupérer des caractères à partir de n'importe quel emplacement
Créez un terrain de jeu avec Xcode 12
Rechercher une instruction Switch qui peut être convertie en une expression Switch
Apprendre Ruby avec la sélection des débutants AtCoder [Quelques sommes] Augmentez les méthodes qui peuvent être utilisées
Je ne peux plus me connecter à une VM avec un conteneur Docker pouvant se connecter via SSH
Créons un conteneur Docker qui peut SSH à la configuration minimale de CentOS 8
Outil d'analyse statique pouvant être utilisé avec GitHub [version Java]
Créer un environnement où pip3 peut être utilisé avec CentOS7 + Python3
Résumé de l'ORM "uroboroSQL" qui peut être utilisé dans le Java d'entreprise
Compétences de puissance qui peuvent être utilisées rapidement à tout moment - Réflexion
Installation de Mecab qui peut se faire presque en tapant une commande
Résumé des JDK pouvant être installés avec Homebrew (à partir de novembre 2019)
Créez un environnement Vue3 avec Docker!
Créer ma page avec Rails
Créez des exceptions avec une interface fluide
[Java 8] Jusqu'à la conversion de l'entrée standard qui peut être utilisée dans les tests de codage en une liste ou un tableau
Ligne de commande qui vous permet de créer une structure de répertoires pour créer un environnement Laravel avec Docker en une seule fois
Traitement d'entrée / sortie de fichier Java pouvant être utilisé via l'historique
Peut-être peut-il être utilisé lors d'une fête de fin d'année? Code du jeu Mosaic
J'ai essayé d'apprendre Java avec une série que les débutants peuvent comprendre clairement
Définissez la charge d'accès qui peut être modifiée graphiquement avec JMeter (Partie 1)
Paramètres à définir lors de l'exploitation d'un environnement de production avec Rails
Notez que VS Code + JUnit 5 peut être utilisé sous Windows 10
[Swift] Color Picker qui peut être utilisé avec copier-coller (palette qui vous permet de sélectionner librement les couleurs)
Créez un fichier jar avec la commande
[Rails6] Créer une nouvelle application avec Rails [Débutant]
Créez une application Web simple avec Dropwizard
Créez un lot à la demande simple avec Spring Batch
[Retrait des rails] Créez une fonction de retrait simple avec des rails