[英]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;
}
})
然后,您將獲得一個可觀察的排序列表。
根據您不想提供有關您的問題的特定信息,有通用的答案。
當需要排序的數據對象實現Comparable
或它的原始類型時。
Observable.just(3, 2, 1) .toSortedList() .subscribe(list -> System.out.print(Arrays.toString(list.toArray())));
[1,2,3]
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.