どうも、ちょげ(@chogetarou)です。
リストビューの要素を移動できるようにする方法を紹介します。
方法
リストビューの要素を移動できるようにするには、ListViewではなくReorderableListViewを使います。
まず、ReorderableListViewの「children」にリストビューの要素を指定します。
ReorderableListView(
children: [
for (int index = 0; index < _items.length; index++)
ListTile(
key: Key('$index'),
tileColor: _items[index].isOdd
? Colors.blue
: Colors.blue.withOpacity(0.2),
title: Text('Item ${_items[index]}'),
),
],
),
ポイントは、Keyを指定する点です。
ReorderableListViewの要素には、Keyを指定しなければいけません。
そして、引数「reOrder」に、要素を並び替える処理を追加します。
ReorderableListView(
children: [
/*Item*/
],
onReorder: (int oldIndex, int newIndex) {
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final int item = _items.removeAt(oldIndex);
_items.insert(newIndex, item);
});
},
),
引数「oldIndex」は操作前のインデックス、引数「newIndex」には操作後のインデックスが格納されます。
この2つの引数を使って、要素を並び替える処理を行います。
これで、要素を移動できるリストビューが実装されます。
以下は、使用例です。
var _items = List<int>.generate(10, (int index) => index);
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: ReorderableListView(
children: [
for (int index = 0; index < _items.length; index++)
ListTile(
key: Key('$index'),
tileColor: _items[index].isOdd
? Colors.blue
: Colors.blue.withOpacity(0.2),
title: Text('Item ${_items[index]}'),
),
],
onReorder: (int oldIndex, int newIndex) {
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final int item = _items.removeAt(oldIndex);
_items.insert(newIndex, item);
});
},
),
),
);
}
まとめ
リストビューの要素を移動できるようにするには、ReorderableListViewを使います。
オススメの記事
小話
本当に些細な話なんですが、ReorderableListViewの要素を移動するには、少しの間、要素を長押しする必要があります。
これを知らないと、「え?動かないんだけど?」、「スクロールすんじゃねぇ!」と謎の奮闘をすることになります。
まあ、それは私の話なんですが・・・。
とにかく、ReorderableListViewで要素を移動するときは、少しの間だけ要素を長押しして動かしてください。
コメント