先看看效果是不是你想要的
library grouped_listview;
import 'package:flutter/material.dart';
typedef TGroup GroupFunction<TElement, TGroup>(TElement element);
typedef Widget ListBuilderFunction<TElement>(BuildContext context, TElement element);
typedef Widget GroupBuilderFunction<TGroup>(BuildContext context, TGroup group);
class GroupedListView<TElement, TGroup> extends StatelessWidget {
final List<TElement> collection;
final GroupFunction<TElement, TGroup> groupBy;
final ListBuilderFunction<TElement> listBuilder;
final GroupBuilderFunction<TGroup> groupBuilder;
final List<dynamic> _flattenedList = List();
GroupedListView(
{@required this.collection,
@required this.groupBy,
@required this.listBuilder,
@required this.groupBuilder}) {
_flattenedList.addAll(Grouper<TElement, TGroup>().groupList(collection, groupBy));
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (context, index) {
var element = _flattenedList[index];
if (element is TElement) {
return listBuilder(context, element);
}
return groupBuilder(context, element);
},
itemCount: _flattenedList.length,
);
}
}
class Grouper<TElement, TGroup> {
final Map<TGroup, List<TElement>> _groupedList = {};
List<dynamic> groupList(List<TElement> collection, GroupFunction<TElement, TGroup> groupBy) {
if (collection == null) throw ArgumentError("Collection can not be null");
if (groupBy == null) throw ArgumentError("GroupBy function can not be null");
List flattenedList = List();
collection.forEach((element) {
var key = groupBy(element);
if (!_groupedList.containsKey(key)) {
_groupedList[key] = List<TElement>();
}
_groupedList[key].add(element);
});
_groupedList.forEach((key, list) {
flattenedList.add(key);
flattenedList.addAll(list);
});
return flattenedList;
}
}
Column(
children: <Widget>[
Container(child: _inputView()),
Expanded(
flex: 1,
child: GroupedListView<Group, String>(
collection: list,
groupBy: (Group g) => g.groupName,
listBuilder: (BuildContext context, Group g) => _buildRow(g),
groupBuilder: (BuildContext context, String name) => Text(name),
)),
],
);
class Group {
String groupName;
UserModel value;
Group(this.groupName, this.value);
}
更多详解:
喜欢可以加Q群号:913934649,点赞,评论;
简书: https://www.jianshu.com/u/88db5f15770d
csdn:https://me.csdn.net/beyondforme
掘金:https://juejin.im/user/5e09a9e86fb9a016271294a7