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

我一直在尝试获取按日期排序的一些消息,但我无法正常工作。我尝试过不同的软件包,例如 grouped_liststicky_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"
  }
]

【问题讨论】:

    标签: flutter listview dart


    【解决方案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 小部件用于每个组中的列表项。

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多