[Flutter]リストビュー(ListView)の要素を移動できるようにするには?

Flutter

どうも、ちょげ(@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.builderを使います。

まとめ

リストビューの要素を移動できるようにするには、ReorderableListViewを使います。

小話

本当に些細な話なんですが、ReorderableListViewの要素を移動するには、少しの間、要素を長押しする必要があります。

これを知らないと、「え?動かないんだけど?」、「スクロールすんじゃねぇ!」と謎の奮闘をすることになります。

まあ、それは私の話なんですが・・・。

とにかく、ReorderableListViewで要素を移動するときは、少しの間だけ要素を長押しして動かしてください。

コメント

タイトルとURLをコピーしました