getCategorizedList<T extends NUITimeListItem> static method

List<NUITimeListItem> getCategorizedList<T extends NUITimeListItem>({
  1. required List<T> data,
  2. Sort sort = Sort.ASCENDING,
  3. required ListCategorizationHeaderGetter<NUITimeListItem> getHeader,
  4. T? prevLastSortedData,
})

Implementation

static List<NUITimeListItem> getCategorizedList<T extends NUITimeListItem>({required List<T> data, Sort sort = Sort.ASCENDING, required ListCategorizationHeaderGetter getHeader, T? prevLastSortedData}){

  final dateSortHash = Map<String, T>(); //Store added header titles
  final dateHash = Map<String, List<T>>(); //Store categorized list

  for(T e in data){
    if(dateHash.containsKey(e.getHeaderId())){
      final innerList = dateHash[e.getHeaderId()]!;
      innerList.add(e);
      dateHash[e.getHeaderId()] = innerList;
    }
    else{
      final innerList = <T>[];
      innerList.add(e);
      dateHash[e.getHeaderId()] = innerList;
      dateSortHash[e.getHeaderId()] = e;
    }
  }

  final sortedTitleList = <NUITimeListItem>[];
  sortedTitleList.addAll(dateSortHash.values);

  if(sort == Sort.ASCENDING) {
    sortedTitleList.sort((first, second) => first.getHeaderWeight().compareTo(second.getHeaderWeight()));
  }
  else {
    sortedTitleList.sort((first, second) => second.getHeaderWeight().compareTo(first.getHeaderWeight()));
  }

  final sortedList = <T>[];
  for(NUITimeListItem v in sortedTitleList){
    final innerListGeneral = <NUITimeListItem>[];
    final innerList = dateHash[v.getHeaderId()]!;

    if(!isNullOrEmpty(innerList)){
      if(sort == Sort.ASCENDING) {
        innerList.sort((first, second) => first.getHeaderWeight().compareTo(second.getHeaderWeight()));
      }
      else {
        innerList.sort((first, second) => second.getHeaderWeight().compareTo(first.getHeaderWeight()));
      }

      if(prevLastSortedData == null){
        innerListGeneral.insert(0, getHeader(v)); //Insert targeted header here as title
      }
      else{
        if(!prevLastSortedData.getHeaderId().match(v.getHeaderId())){ //This header not added previously, so add
          innerListGeneral.insert(0, getHeader(v)); //Insert targeted header here as title
        }
      }
      innerListGeneral.addAll(innerList);
      sortedList.addAll(innerListGeneral as Iterable<T>); //Add remaining list items
    }
  }

  return sortedList;
  }