如何使listview具有标题和ListTile?
我有ListView,需要在当前位置索引中插入几个标题。 但若我使用“翻滚”的方法,我的索引并没有按顺序排列,我将失去列表中的第一名和最后一名 如果我添加itemCount:_list.length+1,后面的索引-=1;我第一节做对了,但下一节不起作用如何使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
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);
}