ListViewでドラッグ&ドロップ

AndroidのListViewでドラッグ&ドロップを実現する方法について。
「リストの並び順を変更できるようにしてほしい」と言われて、日ごろAccessVBで業務アプリを作っている自分が真っ先に思い浮かぶのは、
リストに上下矢印ボタンを追加して、ボタンが押されると並び順が入れ替わる


リストに並び順を表す数字を追加して、数字を書き換えると並び順が入れ替わる

だ。が、それではあまりにもスマホアプリっぽくない。どうせならドラッグ&ドロップでできないものか、と調べてみた。

最初に見つけたのは「DragSortListView」というライブラリ。GitHubで公開されているほか、Google Playにサンプルアプリも公開されている。
自分のAndroid機にインストールしてみるとかなり多機能で便利そうなライブラリだった。
参考サイト:
http://www.abe3.net/2013/02/drag-sort-listview/
http://dangoya.jp/?p=160

ちなみに対応バージョンは2.1(API Level7)以降。
多機能すぎて何していいのか良く分からん、ということで他に無いか探していたら、「CWAC TouchListView」というライブラリを発見。こちらもGitHubで公開されている。
参考サイト:
ドラッグアンドドロップできるListViewを作成する | TechBooster


こちらは1.6(API Level4)でも使用できる。ただし上記の解説サイトによれば

※このライブラリのライセンスはApache Software License 2.0ですので使用する際にはプロジェクトへのライセンスファイルの同梱が必要になります。

とある。
Androidアプリに適用する場合はどうすればいいんだろう?ということで「Apache Software License 2.0」でググってみたところ次のサイトを発見。
Android アプリに Apache License, Version 2.0 のライブラリを組み込むときにしなければならないこと - ひだまりソケットは壊れない
まとめると

  • Google Playの説明文に「Apache Software License 2.0ライセンスのソースコードを使用している」ことを書く。
  • アプリ内にライセンスの文章を表示する。

ということらしい。今回は「インフォメーション」メニューを追加し、ライセンスの文章をAlertDialogで表示するようにした。


TouchListViewの使い方についてはTechBoosterの解説サイトとライブラリに添付されているデモを見ればだいたい分かると思う。
デモでは文字列配列をリストに出力していたが、自分のアプリではデータをSQLiteに保存しているため、Activityを表示するときにSQLiteからデータを読み込み、Adapterクラスに引き渡すようにした。
あとは「保存」メニューを追加して、ListViewの並び順を保存するようにした。

  • adapter.getCount()で件数を取得できるので0からadapter.getCount()までループ
  • adapter.getItem(i)で該当の要素を取得
  • ループカウンタ(i)を並び順としてSQLiteを更新

ドラッグ&ドロップのタイミングでSQLiteを更新することも考えたけど、操作を取り消したい場合もあるんじゃないかと思い止めた。


リストに表示させるときはSQLでソート順を指定すればよい。


とりあえずこれで項目の並び替えを実現することができた。