山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

【Android】RecyclerView、行をドラッグして並び替え

RecyclerView の使い方、3シリーズ目です。

1シリーズ目:【Android】簡潔に RecyclerView を使う。 - 山崎屋の技術メモ
2シリーズ目:【Android】イメージを含んだリッチな行を持つ RecyclerView - 山崎屋の技術メモ

今回は行をドラッグしたときに行の並べ替えを行いたいと思います。

1シリーズ目、2シリーズ目のソースを流用するのであらかじめ見ておいてください。


完成形
f:id:yyama1556:20210214141957g:plain

ドラッグして並び替え

かなり簡単です。

MainActivity.java を修正します。

修正前:

package org.yyama.recyclerviewsample;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        String[] myDataset = {"aaa","bbb","ccc"};
        RecyclerView.Adapter mAdapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(mAdapter);
    }
}

 
 
修正後:

package org.yyama.recyclerviewsample;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        String[] myDataset = {"aaa","bbb","ccc"};
        final RecyclerView.Adapter mAdapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(mAdapter);
        RecyclerView.ItemDecoration itemDecoration =
                new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
        recyclerView.addItemDecoration(itemDecoration);

        // ドラックアンドドロップの操作を実装する
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(
                new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
                        ItemTouchHelper.ACTION_STATE_IDLE) {
                    @Override
                    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                        final int fromPos = viewHolder.getAdapterPosition();
                        final int toPos = target.getAdapterPosition();
                        mAdapter.notifyItemMoved(fromPos, toPos);
                        return true;
                    }

                    @Override
                    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                    }
                });
        itemTouchHelper.attachToRecyclerView(recyclerView);
        
    }
}

簡単に説明します。
 
まず、ItemTouchHelper を new します。
コンストラクタの引数には ItemTouchHelper.SimpleCallback のインスタンスを渡しています。
そして ItemTouchHelper#attachToRecyclerView を呼び出し、RecyclerView に ItemTouchHelper をアタッチしています。

これだけで行をドラックすることにより、並び替えを行うことが出来るようになりました。

まとめ

今回は RecyclerView の行をドラッグして並び替える方法を紹介しました。

それでわ!

はじめてのAndroidプログラミング 第5版

はじめてのAndroidプログラミング 第5版