如何使用 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;
}
})
然后你得到一个可观察的排序列表。
根据您不想提供有关您的问题的具体信息,这里有通用答案。
当需要排序的数据对象实现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;
您可以使用在日期对象中找到的方法引用进行比较。
例如。
在这个例子中,unsortedDevices
是一个标准的 ObservableList,用于 TablView。
SortedList<HistoryDisplayItem> sortedItems = new SortedList<>(unsortedDevices,
comparingInt(HistoryDisplayItem::getNumber));
如何通过 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;
}
})
然后你得到一个可观察的排序列表。
根据您不想提供有关您的问题的具体信息,这里有通用答案。
当需要排序的数据对象实现
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;
您可以使用在日期对象中找到的方法引用进行比较。
例如。
在这个例子中,unsortedDevices
是一个标准的 ObservableList,用于 TablView。
SortedList<HistoryDisplayItem> sortedItems = new SortedList<>(unsortedDevices,
comparingInt(HistoryDisplayItem::getNumber));