按第一个单词分组列表视图



我目前有一个显示大量对象的ListView。相当多的这些对象共享相同的第一个/两个单词,例如:

  • 彼得。约翰逊
  • 彼得杰克逊
  • 彼得·史密斯

我想把这个ListView分成基于他们的名字开始的组。例如,所有的彼得斯会被分到同一组。然后下一个多人共享的名字也会被分成他们自己的组。

问题是我不能明确地说这些名字是什么,我该如何把它们分开呢?

这是一个很难的问题,我将尽可能地简化它,但一般的答案是首先编写一个算法,按照你想要的方式分割字符串(在这种情况下,如果第一个单词是相同的),然后将它们嵌套到列或其他地方。

在这里,我将这些值拆分为一个映射,以名字作为键,并将所有具有该名字的人的列表作为值

// Theres probably a better way to do this
Map<String, List<String>> valuesByFirstName(List<String> values) {
Map<String, List<String>> result = {};
for (final val in values) {
final fn = val.split().first;
if (result[fn] != null) result[fn]!.add(val);
else result[fn] = [val];
}
return result;
}

我不知道你想怎么把这些分组所以我只做了一些基本的例子:

var values = valuesByFirstName(originalValues);
return Row(
children: [
for (var key in values.keys)
SizedBox(
height: 200,
width: 100,
child: ListView(
children: [
Text(key, style: TextStyle(fontSize: 20)),
for (var value in values[key])
Text(value),
]
),
),
),
],
);

如果您想收缩不同的部分,请查看ExpansionPanel小部件