我有ListView,需要在当前位置(索引)插入几个标题。 但是,如果我使用来自涛涛的方法,但我的索引不正确,那么我将从列表中丢失第一名和最后一名...
如果我添加itemCount:_list.length + 1,后一个索引-= 1;我的第一部分正确,但不适用于下一个标题。
---
title: "Report"
date: "`r format(Sys.time(), '%d %B, %Y')`"
always_allow_html: yes
output:
pdf_document:
fig_caption: yes
keep_tex: yes
toc: true
toc_depth: 2
params:
Text1: 'NULL'
Image1: 'NULL'
---
(1) `r params$Text1`
`r params$Image1`
那么如何纠正索引数字并显示带有插入标题的列表中的所有项目。
答案 0 :(得分:0)
您可以使用this方法...
创建代表不同项目类型(HeaderItem
,MessageItem
)的类,然后将_list
映射到项目列表(您需要在{{1}中包含标头值) }!-例如,您可以做_list
,最后使用_list.insert(18, "Part 2:...")
。
完整示例:
ListView.builder
带有复选框的示例:
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);
}
现在为App
,StatefulWidget
具有MessageItem
属性。
checked