如何使用RxAndroid进行排序

时间:2017-04-04 09:14:23

标签: android sorting rx-java rx-android

如何通过Rx函数对列表进行排序,我的列表包含三种不同的源,然后我想显示使用日期排序的列表,如何使用RxAndroid应用它?

 subscriptions.add(complaintsAPI.getComplaintsAPI(userDetails.getUsername())
            .compose(ReactiveUtils.applySchedulers())
            .map(list -> {
                List<ComplaintsRowModel> rowModel = new ArrayList<>();
                for (Complaint complaint : list.getComplaints()) {
                    rowModel.add(new ComplaintsRowModel(complaint.getDisputeNo(),
                            complaint.getOpenDate(), complaint.getArea(), complaint.getStatus()));

                    model.complaintsList.put(complaint.getDisputeNo(), complaint);
                }


                for (OnlineRequest onlineRequest : list.getOnlineRequests()) {
                    rowModel.add(new ComplaintsRowModel(onlineRequest.getRequestNo(), onlineRequest.getOpenDate(),
                            onlineRequest.getArea(), onlineRequest.getStatus()));

                    model.complaintsList.put(onlineRequest.getRequestNo(), onlineRequest);
                }

                for (LlTickets llTickets : list.getLlTickets()) {
                    rowModel.add(new ComplaintsRowModel(llTickets.getTicketNo(), llTickets.getOpenDate(),
                            llTickets.getType(), llTickets.getStatus()));

                    model.complaintsList.put(llTickets.getTicketNo(), llTickets);
                }


                return rowModel;}
            ).toSortedList(){
        //how to sort here
    }).subscribe(new RequestSubscriber<List<ComplaintsRowModel>>(view.getContext(), view.progressView) {

            @Override
                public void onFailure(RequestException requestException) {
                    view.showError(requestException);
                }

                @Override
                public void onNoData() {
                    super.onNoData();
                    isAllDataLoaded = true;
                    view.noDataFound();
                    model.setNoDataFound(true);
                }

                @Override
                public void onNext(List<ComplaintsRowModel> complaintsRowModels) {
                    isAllDataLoaded = true;
                    model.setRowModel(complaintsRowModels);
                    view.buildList(complaintsRowModels);
                }
            }));

我认为在toSortedList()我可以对列表进行排序,但我不知道如何应用它。

3 个答案:

答案 0 :(得分:3)

toSortedList运算符仅适用于Observable<ComplaintRowModel>,而您所拥有的运算符为Observable<List<ComplaintRowModel>>。首先,您必须使用

转换您的observable
flatMapIterable(complaintRowModels -> complaintRowModels)

将其映射到列表元素的可观察对象。然后你可以应用类似

的排序
toSortedList((complaintRowModel, complaintRowModel2) -> {
    Date date = complaintRowModel.getDate();
    Date date2 = complaintRowModel2.getDate();

    // comparing dates is very much dependent on your implementation
    if (date <before> date2) {
        return -1;
    } else if (date <equal> date2) {
        return 0;
    } else {
        return 1;
    }
})

然后你会得到一个可观察的排序列表。

答案 1 :(得分:1)

根据您的要求,您不想提供有关您问题的具体信息,这是一般答案。

  1. 当需要排序的数据对象实现scala> val in = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) in: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) scala> in.transpose res0: List[List[Int]] = List(List(1, 4, 7), List(2, 5, 8), List(3, 6, 9)) scala> in.transpose.map(_.sum) res1: List[Int] = List(12, 15, 18) 或它的原始类型时。

    Comparable
  2.   

    [1,2,3]

    1. 当需要排序的数据对象没有实现Observable.just(3, 2, 1) .toSortedList() .subscribe(list -> System.out.print(Arrays.toString(list.toArray()))); 或实现它时,您需要指定您希望如何对数据进行排序。
    2. 该示例说明了如何按Comparable字段按降序对对象列表进行排序。

      val
        

      [ToSort {val = 3},ToSort {val = 2},ToSort {val = 1}]

答案 2 :(得分:0)

重复

的不同方法
// comparing dates is very much dependent on your implementation
if (date <before> date2) {
    return -1;
} else if (date <equal> date2) {
    return 0;
} else {
    return 1;
}

使用static import java.util.Comparator.comparing; 您可以使用日期对象内部的方法引用进行比较。

实施例。 在这种情况下,unsortedDevices是一个标准的ObservableList,用于TablView。

SortedList<HistoryDisplayItem> sortedItems = new SortedList<>(unsortedDevices,
            comparingInt(HistoryDisplayItem::getNumber));