列表视图按日期分组 Dart

Posted

技术标签:

【中文标题】列表视图按日期分组 Dart【英文标题】:Listview group by date Dart 【发布时间】:2020-10-13 06:44:43 【问题描述】:

我一直在尝试获取按日期排序的一些消息,但我无法正常工作。我尝试过不同的软件包,例如 grouped_list 和 sticky_headers。

使用sticky_headers,我设法在每个帖子上方添加了一个标题,但这不是我想要的。我想让消息按天排序。如下图所示:

下面我有一个数据集,其中包含从我的 API 获得的数据。我的目的是从 API 中获取 40 条消息。这 40 条消息按时间排序,只有消息必须在应用程序中按天分组,如上图所示。

编辑: 在玩了一些 sticky_header 包之后。我现在已经设法获得标题。只是不要设法获取正确标题下的消息。

数据集:

[
  
    "time": "2020-06-16T10:31:12.000Z",
    "message": "P2 BGM-01 HV buiten materieel (Gas lekkage) Franckstraat Arnhem 073631"
  ,
  
    "time": "2020-06-16T10:29:35.000Z",
    "message": "A1 Brahmslaan 3862TD Nijkerk 73278"
  ,
  
    "time": "2020-06-16T10:29:35.000Z",
    "message": "A2 NS Station Rheden Dr. Langemijerweg 6991EV Rheden 73286"
  ,
  
    "time": "2020-06-15T09:41:18.000Z",
    "message": "A2 VWS Utrechtseweg 6871DR Renkum 74636"
  ,
  
    "time": "2020-06-14T09:40:58.000Z",
    "message": "B2 5623EJ : Michelangelolaan Eindhoven Obj: ziekenhuizen 8610 Ca CATH route 522 PAAZ Rit: 66570"
  
]

【问题讨论】:

【参考方案1】:

首先,分解代码以从数据集中按日期映射分组。然后使用此地图构建 UI。

使用collection包使用groupBy功能。

import "package:collection/collection.dart";

void main() 
  final dataSet = [
    
      "time": "2020-06-16T10:31:12.000Z",
      "message": "Message1",
    ,
    
      "time": "2020-06-16T10:29:35.000Z",
      "message": "Message2",
    ,
    
      "time": "2020-06-15T09:41:18.000Z",
      "message": "Message3",
    ,
  ];

  var groupByDate = groupBy(dataSet, (obj) => obj['time'].substring(0, 10));
  groupByDate.forEach((date, list) 
    // Header
    print('$date:');

    // Group
    list.forEach((listItem) 
      // List item
      print('$listItem["time"], $listItem["message"]');
    );
    // day section divider
    print('\n');
  );

输出:

2020-06-16:
2020-06-16T10:31:12.000Z, Message1
2020-06-16T10:29:35.000Z, Message2


2020-06-15:
2020-06-15T09:41:18.000Z, Message3

我希望这个 sn-p 将帮助您开始构建您的 UI。 您可以将ListView 小部件用于每个组中的列表项。

通过DateTime、DateFormat 类来处理日期、时间值。

【讨论】:

【参考方案2】:

有一些名为 sticky_grouped_listgrouped_list 的 dart.pub 包(在您的问题中提到)。他们通过一个共同的属性围绕组元素做了很好的工作。我已经尝试过 sticky_grouped_list 并且除了我没有在您的特定场景中使用它之外,它似乎适用于它,一旦列表可以按动态类型对元素进行分组。

除了外观之外,您的代码和that example 之间的主要功能区别在于它们使用了 DateTime 元素而不是 String 作为对列表进行分组的更好方式。粘性组列表视图很有趣,因为当前日期在滚动时会停留在屏幕顶部。

instead of using a ListView create a GroupedListView Widget:

  GroupedListView<dynamic, String>(
    elements: _elements,
    groupBy: (element) => element['group'],
    groupSeparatorBuilder: (String groupByValue) => Text(groupByValue),
    itemBuilder: (context, dynamic element) => Text(element['name']),
    order: GroupedListOrder.ASC,
  ),

使用 StickyGroupedListView,您还可以按自定义对象进行分组:

StickyGroupedListView<CustomObject, DateTime>(
  elements: pedidos,
  order: StickyGroupedListOrder.ASC,
  groupBy: (CustomObject element) => DateTime(
      element.dateGroup.year,
      element.dateGroup.month,
      element.dateGroup.day),
  groupSeparatorBuilder: (CustomObject element) =>
      renderDataCabecalho(element),
  itemBuilder: (context, element) 
    return _buildPedidoItemView(element, context);
  ,
),

如果它不适用于您的需求,您可能会了解他们对元素分组的方法。

【讨论】:

添加项目时会不断重新创建小部件 @Chickenchaser 这取决于你如何添加 itens。尝试使用 RXDart(BehaviorSubject 和 StreamBuilder)来控制它会更复杂。 @Chickenchaser 很高兴知道你成功了!【参考方案3】:

如果 API 支持排序,则以正确的顺序获取结果将是最简单、性能最高的解决方案。

【讨论】:

API 不支持。然后我必须自己将它构建到 API 中。只有这样的问题是我如何让这些标题工作......谢谢你的回答! 在这种情况下,数据库查询(从 API 内发出)是否支持排序? 将是最简单和最高效的解决方案。 是的,查询可以按日期排序。但是我必须检查何时必须显示新的标题日期 对不起,我刚刚再次阅读了您的问题,我认为您的措辞让我很失望。所以(只是确保我直截了当)你真正想知道的不是如何按天对消息进行排序,而是如何按天对消息进行分组。对吗? 哈哈,没关系。但这正是我想知道的!【参考方案4】:
I think you should filter data in the model to create groups follow the date.
class ListDate 
  int id;
  String name;  
  String date;
  List<DateItem> results;

class DateItem 
  String id;
  String date;
  String name;

After parse JSON to model, you can run listView by ListDate().results

【讨论】:

以上是关于列表视图按日期分组 Dart的主要内容,如果未能解决你的问题,请参考以下文章

按字典中的日期划分表视图

按日期和国家对表格视图部分进行分组

带有分隔符的颤振组列表视图

drupal 7 - 按分类术语分组

按月/年分组 FechedResults 以显示带有部分的 swiftui 列表

Qt 模型的树视图和表视图