Androidアプリ開発

RecyclerViewでスクロール位置を
保持する方法

この記事は約9分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事はAndroidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発やJavaでの開発を始めたい方への案内は、記事の最後で紹介します)

この記事のテーマ


スクロール位置を保持した状態でRecyclerViewを再表示する

ListViewでスクロール位置を保持する方法はこちらです↓↓↓

◎ポイント

Andoridアプリの開発で、
リスト表示する場合に、
RecyclerView を使用することが多いと思います。
アイテムの削除や画面遷移などで RecyclerView を再表示させた場合、
スクロール位置がリセットされます。
開発者からすると当たり前の動作ですが、
削除画面遷移 の度にスクロール位置がリセットされると、
操作性が著しく低下します。
スクロール位置を保持して状態で、RecyclerViewを再表示する仕組みを実装します。

削除の確認メッセージ。
OKボタンを押すと、リストを再描画する必要があります。

RecyclerView

RecyclerView ListView がリスト選択(タップ)に特化した
子画面(
ダイアログ)向けのライブラリに対して、
リスト選択以外の操作(スワイプやドラッグ&ドロップ)が可能な
親画面(
ActivityFragment)向けのライブラリです。

スクロール位置を取得する

RecyclerView(motionView)の setOnItemClickListener で
アイテムの選択(タップ)をフックし、
LinearLayoutManager
findFirstVisibleItemPosition を使用して、
リスト表示している一番上のアイテムの位置を取得します。

    private int                         motionPos = 0;
    :
        motionView.setOnItemClickListener((view, position) -> {
            // スクロール位置取得
            LinearLayoutManager layoutManager = (LinearLayoutManager) motionView.getLayoutManager();
            if (layoutManager != null)
                motionPos = layoutManager.findFirstVisibleItemPosition();
            else
                motionPos = 0;
    :

スクロール位置を保持した状態でRecyclerViewを表示する

scrollToPositionWithOffset を使用して、RecyclerView をスクロールさせます。

        :
        LinearLayoutManager layoutManager = (LinearLayoutManager) motionView.getLayoutManager();
        if (layoutManager != null)
            layoutManager.scrollToPositionWithOffset(motionPos, 0);
        :

Activity間で画面遷移する場合

スクロール位置を Bundle に保持します。

    :
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Bundle取得
        Intent intent = getIntent();
        if (intent.getExtras() != null) {
            RestoreCondition(intent.getExtras());
        }
    :

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        SaveCondition(outState);
        super.onSaveInstanceState(outState);
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (DEBUG) Log.d(TAG, "onRestoreInstanceState");
        RestoreCondition(savedInstanceState);
    }
    :

    // Bundle操作 //
    private Bundle SaveCondition(Bundle bundle) {
        :
        bundle.putString("motionPos",String.valueOf(motionPos));
        return bundle;
    }
    private void RestoreCondition(Bundle bundle) {
        :
        motionPos = Integer.parseInt(bundle.getString("motionPos"));
    }

今回は、ここまでです。

RecyclerViewでスクロール位置を保持する方法 を使用している Androidアプリです。

USB電源が足りなくて、困っている人におすすめ♪

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めてのAndroidのアプリ開発では、アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、書籍などによる独学ではアプリ開発できるようになるには、かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

未経験者からシステムエンジニアを目指すのに最適ですまずは無料相談から♪

カリキュラムとサポートがしっかりしていますお得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪