2017-04-04 68 views
0

如何通过排序接收功能我的列表进行排序,我的目录包含三种类型不同的来源,然后我要显示我的名单使用日期排序,如何申请,使用RxAndroid?如何使用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()我可以整理我的列表,但我不知道以应用的方式。

+0

请出示您的模型 - 'LlTickets','OnlineRequest','Complaint','ComplaintsRowModel'以及要如何排序呢细节(最好用例子)解释。否则你的问题没有意义。 – Divers

+0

无需模型的细节只是我想知道如何分拣过程中使用的Rx应用,那种片断,谢谢 – 3zcs

回答

2

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; 
    } 
}) 

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

+0

'日期 Divers

+0

不是,它在很大程度上取决于哪种格式的日期被保存 – Lamorak

+0

在你的代码是'日期date',这就是为什么它的混乱。 – Divers

0

按照你不想提供问题的具体信息,有通用的答案。

  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}]

    0

    不同的方法来replce的

    // 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; 你可以使用日期对象内部发现方法的参考比较。

    Ex。 在这种情况下unsortedDevices处于TablView中使用的标准ObservableList。

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