做过Android开发的同学知道,Android的ListView提供addHeaderView和addFooterView两个方法用于添加View到ListView;
RecyclerView则通过定义不同的ItemType区分HeaderViewItem和普通的ListItem,在Adapter中加上逻辑判断返回对应的ViewHolder,处理起来还是有点麻烦的。
而flutter的ListView怎么处理呢?有两种方式:
- 参考RecyclerView的实现方式,定义不同类型的Item,如果想保持HeaderViewItem滚出屏幕外而不会被销毁,需要使用KeepAlive控件对HeaderViewItem做一层包裹;
- 使用CustomScrollView + SliverToBoxAdapter + SliverList;
推荐使用方式2,实现简单没有多余的判断逻辑处理,废话少说,直接上代码:
class MyHomePage extends StatelessWidget {
// 列表项
Widget _buildListItem(BuildContext context, int index){
return ListTile(
title: Text('list tile index $index')
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Demo'),
),
body: CustomScrollView(
slivers: <Widget>[
// 如果不是Sliver家族的Widget,需要使用SliverToBoxAdapter做层包裹
SliverToBoxAdapter(
child: Container(
height: 120,
color: Colors.green,
child: Text('HeaderView'),
),
),
// 当列表项高度固定时,使用 SliverFixedExtendList 比 SliverList 具有更高的性能
SliverFixedExtentList(
delegate: SliverChildBuilderDelegate(_buildListItem, childCount: 30),
itemExtent: 48.0
)
],
),
);
}
}