如何使用 RxAndroid 进行排序

How to sort using RxAndroid

如何通过 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() 中我可以对我的列表进行排序,但我不知道如何应用它。

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

转换你的可观察对象
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. 当需要排序的数据对象实现Comparable或者是原始类型时。

    Observable.just(3, 2, 1)
            .toSortedList()
            .subscribe(list -> System.out.print(Arrays.toString(list.toArray())));
    

[1, 2, 3]

  1. 当需要排序的数据对象未实现或未实现 Comparable,但您需要指定数据排序方式时。

该示例说明了如何按 val 字段按降序对对象列表进行排序。

static class ToSort {
    Integer val;

    public ToSort(Integer val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "ToSort{" +
                "val=" + val +
                '}';
    }
}

public static void main(String[] args) {
    Observable.just(new ToSort(1), new ToSort(2), new ToSort(3))
            .toSortedList((o1, o2) -> (-1) * o1.val.compareTo(o2.val))
            .subscribe(list -> System.out.print(Arrays.toString(list.toArray())));
}

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

替换

的不同方法
// 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));