無限スクロールするRecyclerViewを実装する

投稿日:2017年9月9日 更新日:

無限スクロールするRecyclerViewを作ってみましたので、実装方法をメモしておきます。

プロジェクトにRecyclerViewを追加

app/build.gradleのdependenciesにrecyclerview-v7を追加します。サポートライブラリのバージョンは合わせておきましょう。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.0.2'
    implementation 'com.android.support:recyclerview-v7:26.0.2' //追加
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

レイアウトファイルを作成

レイアウトファイルを作成します。

まずはactivity_main.xmlにRecyclerViewを追加します。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.recyclerviewpractice.MainActivity">
<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

list_item.xmlを作成します。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.example.recyclerviewpractice.MainActivity">
<TextView
        android:id="@+id/itemText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</FrameLayout>

無限スクロールするRecyclerViewの実装

いよいよ本題。適当にMainActivityの中で無限スクロールするRecyclerViewを実装しています。

ポイントはgetItemCount()で実質上、無限の値を設定していること、アイテムの位置をうまいこと調整していることです。

package com.example.recyclerviewpractice;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //RecyclerView関係に必要な処理を適当に実装
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        //表示するデータを作成
        List dataset = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            dataset.add(String.valueOf(i));
        }

        //RecyclerViewのアダプターを設定
        RecyclerView.Adapter adapter = new MyAdapter(dataset);
        recyclerView.setAdapter(adapter);

        //無限スクロールの初期位置を調整
        recyclerView.getLayoutManager().scrollToPosition(Integer.MAX_VALUE / 2 - ((Integer.MAX_VALUE / 2) % dataset.size()));
    }

    static class MyAdapter extends RecyclerView.Adapter {

        private List dataset;

        public MyAdapter(List dataset) {
            this.dataset = dataset;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            //無限スクロールするように位置を調整
            holder.itemText.setText(dataset.get(position % dataset.size()));
            holder.itemText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.i("onClick", "clicked!");
                }
            });
        }

        @Override
        public int getItemCount() {
            //無限スクロールさせるために極端に大きな値を設定
            return Integer.MAX_VALUE;
        }

        static class ViewHolder extends RecyclerView.ViewHolder {

            TextView itemText;

            public ViewHolder(View itemView) {
                super(itemView);
                itemText = itemView.findViewById(R.id.itemText);
            }
        }
    }
}

こんな感じで、RecyclerViewの要素が循環しているのがわかるかと思います。

茨城県つくば市在住のAndroidアプリエンジニアです。

-Android

Copyright© Androidアプリ開発@つくば , 2017 AllRights Reserved Powered by AFFINGER4.