Flutter 颤振:如何在ListView中组合卡片小部件

Flutter 颤振:如何在ListView中组合卡片小部件,flutter,Flutter,我有一个屏幕,通过JSON显示来自web服务的数据。数据显示在列表视图中,每个项目都显示在卡片中 这是伟大的工作,但如果我有两个项目在同一天,我想显示他们在同一个日期在一起 第一个图像是它现在的显示方式,第二个是我想要的模型。谁能告诉我怎么做 干杯 保罗 JSON: 您应该按照下面的方式执行 首先,您应该在数据模型中添加子对象列表 例如: class DataModel { int JOBID; int START_DATE; String START_TIME; String

我有一个屏幕,通过JSON显示来自web服务的数据。数据显示在列表视图中,每个项目都显示在卡片中

这是伟大的工作,但如果我有两个项目在同一天,我想显示他们在同一个日期在一起

第一个图像是它现在的显示方式,第二个是我想要的模型。谁能告诉我怎么做

干杯

保罗

JSON:


您应该按照下面的方式执行

首先,您应该在数据模型中添加子对象列表

例如:

class DataModel {
  int JOBID;
  int START_DATE;
  String START_TIME;
  String END_TIME;
  String JOB_NAME;
  List<DataModel> child;

  DataModel(this.JOBID, this.START_DATE, this.START_TIME, this.END_TIME,
      this.JOB_NAME, this.child);

  @override
  String toString() {
    return "{JobID:$JOBID,StartDate:${DateTime.fromMillisecondsSinceEpoch(START_DATE)},StartTime:$START_TIME,EndTime:$END_TIME,JobName:$JOB_NAME,child:${child.toString()}}";
  }
}
类数据模型{
int-JOBID;
int开始日期;
字符串开始时间;
字符串结束时间;
字符串作业名称;
列出儿童;
数据模型(this.JOBID、this.START\u日期、this.START\u时间、this.END\u时间、,
这个.JOB(你的名字,这个.child);
@凌驾
字符串toString(){
返回“{JobID:$JobID,StartDate:${DateTime.FromMillisSecondssinceEpoch(开始日期)},StartTime:$START\U TIME,EndTime:$END\U TIME,JobName:$JOB\U NAME,child:${child.toString()}”;
}
}
现在您添加了以下两种方法,它们过滤数据并提供具有相同日期的子项的列表

  List<DataModel> getFilteredList(ListData listData) {
    listData.rows.sort((a, b) =>
        DateTime.fromMillisecondsSinceEpoch(b.START_DATE)
            .compareTo(DateTime.fromMillisecondsSinceEpoch(a.START_DATE)));

    for (int i = 0; i < listData.rows.length; i++) {
      print(listData.rows[i].toString());
    }
    DataModel prev;
    bool isHeader = false;
    List<DataModel> filterList = [];
    int index = 0;
    listData.rows.forEach((element) {
      if (prev != null && !isSameDate(element.START_DATE, prev.START_DATE)) {
        isHeader = true;
      }
      if (!isHeader) {
        if (filterList.length != 0) {
          filterList[index].child.add(element);
        } else {
          filterList.add(DataModel(element.JOBID, element.START_DATE,
              element.START_TIME, element.END_TIME, element.JOB_NAME, []));
        }
      } else {
        filterList.add(DataModel(element.JOBID, element.START_DATE,
            element.START_TIME, element.END_TIME, element.JOB_NAME, []));
        index++;
        isHeader = false;
      }
      prev = element;
    });
    return filterList;
  }

  bool isSameDate(int startDate, int startDate2) {
    var date1 = DateTime.fromMillisecondsSinceEpoch(startDate);
    var date2 = DateTime.fromMillisecondsSinceEpoch(startDate2);
    return date1.day == date2.day &&
        date1.month == date2.month &&
        date1.year == date2.year;
  }




filteredListData = getFilteredList(listData);
List getFilteredList(ListData ListData){
listData.rows.sort((a,b)=>
DateTime.From毫秒新纪元(b.开始日期)
.compareTo(DateTime.fromsmillissecondssinceepoch(a.START_DATE));
for(int i=0;i
fileredListData具有正确的数据

完整示例

class Demo extends StatefulWidget {
  @override
  _DemoState createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  ListData listData = ListData.empty();

  List<DataModel> filteredListData;

  @override
  void initState() {
    super.initState();
    listData.rows = [];
    listData.rows
        .add(new DataModel(23, 1588809600000, "08:35", "17:35", "F-1", []));
    listData.rows
        .add(new DataModel(24, 1588809600000, "18:00", "07:30", "F-1.1", []));
    listData.rows
        .add(new DataModel(25, 1588896000000, "08:35", "17:35", "A-1", []));
    listData.rows
        .add(new DataModel(26, 1590057927000, "08:35", "17:35", "New -1", []));
    listData.rows
        .add(new DataModel(27, 1588896000000, "08:35", "17:35", "A-1.1", []));
    listData.rows.add(
        new DataModel(28, 1590057927000, "08:35", "17:35", "New -1.1", []));
    listData.rows
        .add(new DataModel(29, 1588896000000, "08:35", "17:35", "A-1.2", []));

    listData.rows
        .add(new DataModel(30, 1590056427000, "08:35", "17:35", "New-1.2", []));
    listData.rows
        .add(new DataModel(31, 1590057027000, "08:35", "17:35", "New-1.3", []));

    filteredListData = getFilteredList(listData);
    for (int i = 0; i < filteredListData.length; i++) {
      print(filteredListData[i].toString());
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: ListView.builder(
      itemCount: filteredListData.length,
      itemBuilder: (builder, parentIndex) {
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text(
                "${DateTime.fromMillisecondsSinceEpoch(filteredListData[parentIndex].START_DATE).toString()} - ${filteredListData[parentIndex].JOB_NAME}"),
            if (filteredListData[parentIndex].child.length > 0)
              ListView.builder(
                itemBuilder: (builder, index) {
                  return Text(
                      filteredListData[parentIndex].child[index].JOB_NAME);
                },
                shrinkWrap: true,
                physics: NeverScrollableScrollPhysics(),
                itemCount: filteredListData[parentIndex].child.length,
              )
          ],
        );
      },
    ));
  }

  List<DataModel> getFilteredList(ListData listData) {
    listData.rows.sort((a, b) =>
        DateTime.fromMillisecondsSinceEpoch(b.START_DATE)
            .compareTo(DateTime.fromMillisecondsSinceEpoch(a.START_DATE)));

    for (int i = 0; i < listData.rows.length; i++) {
      print(listData.rows[i].toString());
    }
    DataModel prev;
    bool isHeader = false;
    List<DataModel> filterList = [];
    int index = 0;
    listData.rows.forEach((element) {
      if (prev != null && !isSameDate(element.START_DATE, prev.START_DATE)) {
        isHeader = true;
      }
      if (!isHeader) {
        if (filterList.length != 0) {
          filterList[index].child.add(element);
        } else {
          filterList.add(DataModel(element.JOBID, element.START_DATE,
              element.START_TIME, element.END_TIME, element.JOB_NAME, []));
        }
      } else {
        filterList.add(DataModel(element.JOBID, element.START_DATE,
            element.START_TIME, element.END_TIME, element.JOB_NAME, []));
        index++;
        isHeader = false;
      }
      prev = element;
    });
    return filterList;
  }

  bool isSameDate(int startDate, int startDate2) {
    var date1 = DateTime.fromMillisecondsSinceEpoch(startDate);
    var date2 = DateTime.fromMillisecondsSinceEpoch(startDate2);
    return date1.day == date2.day &&
        date1.month == date2.month &&
        date1.year == date2.year;
  }
}
类演示扩展StatefulWidget{
@凌驾
_DemoState createState();
}
类_DemoState扩展了状态{
ListData ListData=ListData.empty();
列出filteredListData;
@凌驾
void initState(){
super.initState();
listData.rows=[];
listData.rows
添加(新数据模型(23158889600000,“08:35”,“17:35”,“F-1”,“[]));
listData.rows
添加(新的数据模型(24158889600000,“18:00”,“07:30”,“F-1.1”,“[]));
listData.rows
添加(新数据模型(25158896000000,“08:35”,“17:35”,“A-1”,“[]));
listData.rows
.add(新数据模型(261590057927000,“08:35”,“17:35”,“新-1”,“[]));
listData.rows
添加(新数据模型(27158886000000,“08:35”,“17:35”,“A-1.1”,“[]));
listData.rows.add(
新数据模型(281590057927000,“08:35”,“17:35”,“新-1.1”,“[]));
listData.rows
添加(新数据模型(29158886000000,“08:35”,“17:35”,“A-1.2”,“[]));
listData.rows
.add(新的数据模型(301590056427000,“08:35”,“17:35”,“new-1.2”,“[]));
listData.rows
添加(新数据模型(311590057027000,“08:35”,“17:35”,“新-1.3”,“[]));
filteredListData=getFilteredList(listData);
对于(int i=0;i0)
ListView.builder(
itemBuilder:(生成器,索引){
返回文本(
filteredListData[parentIndex]。子[index]。作业名称);
},
收缩膜:对,
物理学:NeverscrollableScroll物理学(),
itemCount:filteredListData[parentIndex].child.length,
)
],
);
},
));
}
列表getFilteredList(ListData ListData){
listData.rows.sort((a,b)=>
DateTime.From毫秒新纪元(b.开始日期)
.compareTo(DateTime.fromsmillissecondssinceepoch(a.START_DATE));
for(int i=0;iclass Demo extends StatefulWidget {
  @override
  _DemoState createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  ListData listData = ListData.empty();

  List<DataModel> filteredListData;

  @override
  void initState() {
    super.initState();
    listData.rows = [];
    listData.rows
        .add(new DataModel(23, 1588809600000, "08:35", "17:35", "F-1", []));
    listData.rows
        .add(new DataModel(24, 1588809600000, "18:00", "07:30", "F-1.1", []));
    listData.rows
        .add(new DataModel(25, 1588896000000, "08:35", "17:35", "A-1", []));
    listData.rows
        .add(new DataModel(26, 1590057927000, "08:35", "17:35", "New -1", []));
    listData.rows
        .add(new DataModel(27, 1588896000000, "08:35", "17:35", "A-1.1", []));
    listData.rows.add(
        new DataModel(28, 1590057927000, "08:35", "17:35", "New -1.1", []));
    listData.rows
        .add(new DataModel(29, 1588896000000, "08:35", "17:35", "A-1.2", []));

    listData.rows
        .add(new DataModel(30, 1590056427000, "08:35", "17:35", "New-1.2", []));
    listData.rows
        .add(new DataModel(31, 1590057027000, "08:35", "17:35", "New-1.3", []));

    filteredListData = getFilteredList(listData);
    for (int i = 0; i < filteredListData.length; i++) {
      print(filteredListData[i].toString());
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: ListView.builder(
      itemCount: filteredListData.length,
      itemBuilder: (builder, parentIndex) {
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text(
                "${DateTime.fromMillisecondsSinceEpoch(filteredListData[parentIndex].START_DATE).toString()} - ${filteredListData[parentIndex].JOB_NAME}"),
            if (filteredListData[parentIndex].child.length > 0)
              ListView.builder(
                itemBuilder: (builder, index) {
                  return Text(
                      filteredListData[parentIndex].child[index].JOB_NAME);
                },
                shrinkWrap: true,
                physics: NeverScrollableScrollPhysics(),
                itemCount: filteredListData[parentIndex].child.length,
              )
          ],
        );
      },
    ));
  }

  List<DataModel> getFilteredList(ListData listData) {
    listData.rows.sort((a, b) =>
        DateTime.fromMillisecondsSinceEpoch(b.START_DATE)
            .compareTo(DateTime.fromMillisecondsSinceEpoch(a.START_DATE)));

    for (int i = 0; i < listData.rows.length; i++) {
      print(listData.rows[i].toString());
    }
    DataModel prev;
    bool isHeader = false;
    List<DataModel> filterList = [];
    int index = 0;
    listData.rows.forEach((element) {
      if (prev != null && !isSameDate(element.START_DATE, prev.START_DATE)) {
        isHeader = true;
      }
      if (!isHeader) {
        if (filterList.length != 0) {
          filterList[index].child.add(element);
        } else {
          filterList.add(DataModel(element.JOBID, element.START_DATE,
              element.START_TIME, element.END_TIME, element.JOB_NAME, []));
        }
      } else {
        filterList.add(DataModel(element.JOBID, element.START_DATE,
            element.START_TIME, element.END_TIME, element.JOB_NAME, []));
        index++;
        isHeader = false;
      }
      prev = element;
    });
    return filterList;
  }

  bool isSameDate(int startDate, int startDate2) {
    var date1 = DateTime.fromMillisecondsSinceEpoch(startDate);
    var date2 = DateTime.fromMillisecondsSinceEpoch(startDate2);
    return date1.day == date2.day &&
        date1.month == date2.month &&
        date1.year == date2.year;
  }
}