如何使listview具有标题和ListTile?

如何使listview具有标题和ListTile?,listview,indexing,flutter,header,Listview,Indexing,Flutter,Header,我有ListView,需要在当前位置索引中插入几个标题。 但若我使用“翻滚”的方法,我的索引并没有按顺序排列,我将失去列表中的第一名和最后一名 如果我添加itemCount:_list.length+1,后面的索引-=1;我第一节做对了,但下一节不起作用 class CheckList extends StatefulWidget { bool isCheck = false; //for checkbox final String value; //geting value from

我有ListView,需要在当前位置索引中插入几个标题。 但若我使用“翻滚”的方法,我的索引并没有按顺序排列,我将失去列表中的第一名和最后一名

如果我添加itemCount:_list.length+1,后面的索引-=1;我第一节做对了,但下一节不起作用

class CheckList extends StatefulWidget {
  bool isCheck = false; //for checkbox
  final String value; //geting value from other class
  List<String> _list = [];

  final List<ListItem> items;

  CheckList({Key key, this.value, this.items}) : super(key: key);

  @override
  _Question createState() => _Question();
}

class _Question extends State<CheckList> {
  BuildContext context;


  _getFromDB() async {
    widget._list = await DB().get2(widget.value, 'Description');

    widget._list.insert(0, "Part 1:...");
    widget._list.insert(18, "Part 2:...");
    widget._list.insert(49, "Part 3:...");

    final List<ListItem> items = widget._list.map((value) {
      final index = widget._list.indexOf(value);
      if ([0, 18, 49].contains(index)) {
        return HeaderItem(value);
      } else {
        return MessageItem(value);
      }
    }).toList();

    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    this.context = context;

    return Scaffold(
        appBar: AppBar(
          title: Text(
            'TITLE APP',
          ),
        ),
        body: Container(
          child: getListView(), //listview populated from db
        ));
  }

  Widget getListView() {
    _getFromDB();
    var listview = ListView.builder(
      itemCount: widget.items.length,
      itemBuilder: (context, index) {
        final item = widget.items[index];
        if (item is HeaderItem) {
          return Column(
            children: <Widget>[
              Text(
                item.heading,
              ),
              Divider(),
            ],
          );
        } else if (item is MessageItem) {
          return ListTile(
            dense: true,
            leading: Checkbox(
              value: item.checked,
              onChanged: (value) {
                setState(() {
                  item.checked = value;
                });
              },
            ),
            title: Text(
              item.title,
            ),
            // subtitle: Text(_list2[index]),
          );
        }
      },
    );

    return listview;
  }
}

abstract class ListItem {}

class HeaderItem implements ListItem {
  final String heading;

  HeaderItem(this.heading);
}

class MessageItem implements ListItem {
  final String title;
  bool checked = false;

  MessageItem(this.title);
}

所以,如何更正索引编号并显示带有插入标题的列表中的所有项目。

您可以使用这种方法

创建表示不同项目类型的类HeaderItem、MessageItem,然后将_列表映射到需要在_列表中包含标题值的项目列表例如,您可以执行_list.insert18,第2部分:。。。最后使用ListView.builder

完整示例:


我的列表来自db,您知道如何在此列表视图中包含复选框吗。TNX你可以做什么?清单18,第2部分:。。。然后将其映射到项目列表。关于复选框:您可以将尾随的:复选框添加到ListTile或使用。@StopicApps抱歉,我没有注意到。我在回答中添加了完整的示例。谢谢,如果我在ListTile中使用training:复选框,如何区分复选框,如果我选中一个复选框,所有复选框都已选中。我知道我需要绘制它们的地图,但不知道如何绘制。TNX首先,项目列表是空的,检查表中的项目和_getFromDB中的项目是两个不同的列表。另一个问题是,您正在内部构建方法中调用_getFromDB。因此,当您点击复选框时,将调用setState并调用build方法,这意味着使用新数据调用_getFromDB方法。最初的问题得到了回答,我不想把答案弄得乱七八糟,所以我共享了固定代码。
import 'package:flutter/material.dart';

void main() {
  final _list = List<String>.generate(100, (index) => "$index");

  _list.insert(0, "Part 1:...");
  _list.insert(18, "Part 2:...");
  _list.insert(49, "Part 3:...");

  final List<ListItem> items = _list.map((value) {
    final index = _list.indexOf(value);
    if ([0, 18, 49].contains(index)) {
      return HeaderItem(value);
    } else {
      return MessageItem(value);
    }
  }).toList();

  runApp(
    MaterialApp(
      home: App(items: items),
    ),
  );
}

class App extends StatelessWidget {
  final List<ListItem> items;

  const App({Key key, this.items}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: items.length,
        itemBuilder: (context, index) {
          final item = items[index];

          if (item is HeaderItem) {
            return Column(
              children: <Widget>[
                Text(
                  item.heading,
                ),
                Divider(),
              ],
            );
          } else if (item is MessageItem) {
            return ListTile(
              leading: Text('$index'),
              title: Text(
                item.title,
                style: TextStyle(fontSize: 18),
              ),
            );
          }
        },
      ),
    );
  }
}

abstract class ListItem {}

class HeaderItem implements ListItem {
  final String heading;

  HeaderItem(this.heading);
}

class MessageItem implements ListItem {
  final String title;

  MessageItem(this.title);
}
import 'package:flutter/material.dart';

void main() {
  final _list = List<String>.generate(100, (index) => "$index");

  _list.insert(0, "Part 1:...");
  _list.insert(18, "Part 2:...");
  _list.insert(49, "Part 3:...");

  final List<ListItem> items = _list.map((value) {
    final index = _list.indexOf(value);
    if ([0, 18, 49].contains(index)) {
      return HeaderItem(value);
    } else {
      return MessageItem(value);
    }
  }).toList();

  runApp(
    MaterialApp(
      home: App(items: items),
    ),
  );
}

class App extends StatefulWidget {
  final List<ListItem> items;

  const App({Key key, this.items}) : super(key: key);

  @override
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: widget.items.length,
        itemBuilder: (context, index) {
          final item = widget.items[index];

          if (item is HeaderItem) {
            return Column(
              children: <Widget>[
                Text(
                  item.heading,
                ),
                Divider(),
              ],
            );
          } else if (item is MessageItem) {
            return ListTile(
              leading: Text('$index'),
              title: Text(
                item.title,
                style: TextStyle(fontSize: 18),
              ),
              trailing: Checkbox(
                value: item.checked,
                onChanged: (value) {
                  setState(() {
                    item.checked = value;
                  });
                },
              ),
            );
          }
        },
      ),
    );
  }
}

abstract class ListItem {}

class HeaderItem implements ListItem {
  final String heading;

  HeaderItem(this.heading);
}

class MessageItem implements ListItem {
  final String title;
  bool checked = false;

  MessageItem(this.title);
}