簡體   English   中英

如何使用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()中對列表進行排序,但是我不知道應用該方法的方法。

當您擁有的是Observable<List<ComplaintRowModel>>toSortedList運算符將僅對Observable<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; 您可以使用date對象中的方法引用進行比較。

防爆。 在這種情況下, unsortedDevices是在TablView中使用的標准ObservableList。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM