[JAVA] Erstellen Sie ein Seitensteuerelement, das mit RecyclerView verwendet werden kann

Was ist Seitensteuerung?

Es ist eine punktförmige Pagenation, die in iOS üblich ist. Es wird unter Android nicht standardmäßig bereitgestellt, daher müssen Sie es erstellen oder eine Bibliothek verwenden. page_control.gif Hier wird es nach iOS als Seitensteuerung bezeichnet, aber in Android gibt es viele Dinge, die als Indikator bezeichnet werden, und die berühmte Bibliothek <a href"https://github.com/JakeWharton/ViewPagerIndicator"> ViewPageIndicator > Und <a href+"https://github.com/ongakuer/CircleIndicator"> CircleIndicator . Diese Bibliotheken konnten jedoch nur mit ViewPager verwendet werden, sodass ich meine eigene benutzerdefinierte Ansicht erstellt habe.

Verwenden Sie RecyclerView wie ViewPager

ViewPager in RecyclerView mithilfe von PagerSnapHelper , das mit SupportLibrary 25.1.0 oder höher verwendet werden kann Sie können das gleiche Verhalten erreichen. Dies ist nützlich, wenn Sie ViewPager in ViewPager vermeiden möchten.

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);

Wenn Sie PagerSnapHelper aufgrund von Versionsproblemen nicht verwenden können, zeigt Ihnen der folgende Artikel, wie Sie Snaps erstellen. http://qiita.com/hotpepsi/items/1167e5263f048a005e05

Erstellen Sie eine Seitensteuerung

Machen Sie einen Punkt

Es gibt zwei Typen: Standard und Ausgewählt.

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>

Erstellen Sie eine benutzerdefinierte Ansicht

Erstellen Sie eine benutzerdefinierte Ansicht, die die folgenden zwei Aktionen ausführt:

--Erstellen Sie so viele Punkte, wie Elemente von RecyclerView angezeigt werden. ――Wenn Sie einrasten, wechseln die Punkte auch zusammen.

Da die Position des aktuell gefangenen Elements beim Umschalten von Punkten in Verbindung mit dem Fangen erforderlich ist, wird es mit `findLastVisibleItemPosition ()` von LinerLayoutManager erfasst.

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);

        //Wechseln Sie die Punkte, während RecyclerView einen Bildlauf durchführt
        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);
            }
        });
    }

  //Erstellen Sie so viele Punkte, wie Elemente in RecyclerView enthalten sind
    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);

       //Passen Sie die Punktgröße und den Abstand an(Das GIF-Bild oben ist 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);
    }
}

Verwenden Sie eine benutzerdefinierte Ansicht

Ordnen Sie es wie eine normale Ansicht an.

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);

Bonus

Sie können es auch mit ViewPager verwenden, indem Sie die setRecyclerView-Methode wie folgt umschreiben. Dies ist einfacher, weil der Hörer eine Position hat.

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

Erstellen Sie ein Seitensteuerelement, das mit RecyclerView verwendet werden kann
Organisieren Sie Methoden, die mit StringUtils verwendet werden können
[Rails] "Pry-Rails", die beim Speichern mit der create-Methode verwendet werden können
Erstellen Sie eine JAR-Datei, die auf Gradle ausgeführt werden kann
Firebase-Realtime-Datenbank für Android, die mit Kopie verwendet werden kann
SwiftUI-Ansicht, die in Kombination mit anderen Frameworks verwendet werden kann
Einfache Implementierung eines Spielautomaten, die mit Kopie verwendet werden kann
Tools zur Leistungsanalyse und Fehlerdiagnose, die mit OpenJDK verwendet werden können
Ruby-Array-Methoden, die mit Rails verwendet werden können (außer jedem)
[OpenJDK11 & JavaFX13] Erstellen Sie eine JavaFX-App mit IntelliJ + gradle und erstellen Sie ein Paket, das zusammen mit einer leichten JRE verteilt werden kann.
Ich habe einen THETA API-Client erstellt, der für die Plug-Entwicklung verwendet werden kann
[ERROR-Meldungsanzeige] Einfache Version, die jederzeit mit der Schienen-Teilvorlage verwendet werden kann
Schreiben einer Klasse, die in Java bestellt werden kann Ein kleines Standard-Memo
Bereich, in dem Variablen mit Ruby verwendet werden können [Scope]
Über die Sache, dass hidden_field wahnsinnig benutzt werden kann
Praktische Tastenkombinationen für Eclipse
Syntax- und Ausnahmebedingungen, die beim Vergleich mit null in Java verwendet werden können
Vier Reihen mit Schwerkraft, die auf der Konsole gespielt werden können
Erstellen Sie eine Methode, mit der Zeichen von jedem Ort abgerufen werden können
Erstellen Sie einen Spielplatz mit Xcode 12
Suchen Sie eine Switch-Anweisung, die in einen Switch-Ausdruck konvertiert werden kann
Lernen Sie Ruby mit AtCoder Anfänger Auswahl [Einige Summen] Erhöhen Sie die Methoden, die verwendet werden können
Ich kann keine Verbindung mehr zu einer VM mit einem Docker-Container herstellen, der eine Verbindung über SSH herstellen kann
Erstellen wir einen Docker-Container, der SSH auf die Mindestkonfiguration von CentOS 8 ausführen kann
Statisches Analysetool, das mit GitHub verwendet werden kann [Java-Version]
Erstellen Sie eine Umgebung, in der pip3 mit CentOS7 + Python3 verwendet werden kann
Zusammenfassung von ORM "uroboroSQL", das in Enterprise Java verwendet werden kann
Kraftfertigkeiten, die jederzeit schnell eingesetzt werden können - Reflexion
Mecab-Installation, die fast durch Eingabe eines Befehls erfolgen kann
Zusammenfassung der JDKs, die mit Homebrew installiert werden können (Stand November 2019)
Erstellen Sie mit Docker eine Vue3-Umgebung!
Erstellen Sie meine Seite mit Rails
Erstellen Sie Ausnahmen mit einer Fluid-Schnittstelle
Erstellen Sie ein Maven-Projekt mit Befehlen
[Java 8] Bis zur Konvertierung von Standardeingaben, die beim Codieren von Tests verwendet werden können, in eine Liste oder ein Array
Befehlszeile, mit der Sie eine Verzeichnisstruktur zum Erstellen einer Laravel-Umgebung mit Docker auf einmal erstellen können
Eingabe / Ausgabe von Java-Dateien, die über den historischen Hintergrund verwendet werden können
Vielleicht kann es auf einer Jahresendparty verwendet werden? Mosaik-Spielcode
Ich habe versucht, Java mit einer Reihe zu lernen, die Anfänger klar verstehen können
Stellen Sie die Zugriffslast ein, die mit JMeter grafisch geändert werden kann (Teil 1).
Einstellungen, die beim Betrieb einer Produktionsumgebung mit Rails vorgenommen werden sollten
Beachten Sie, dass VS Code + JUnit 5 unter Windows 10 verwendet werden kann
[Swift] Farbwähler, der zum Kopieren und Einfügen verwendet werden kann (Palette, mit der Sie Farben frei auswählen können)
Erstellen Sie mit dem Befehl eine JAR-Datei
[Rails6] Erstelle eine neue App mit Rails [Anfänger]
Erstellen Sie mit Dropwizard eine einfache Webanwendung
Erstellen Sie mit Spring Batch eine einfache On-Demand-Charge
[Schienenentnahme] Erstellen Sie eine einfache Entnahmefunktion mit Schienen