2016-04-03 22 views
2

um Textänderungen auf EditText beobachten -Beachten Sie Textänderungen und Filterliste mit RxAndroid

RxTextView.textChangeEvents(editText) 
    .subscribe(e -> log(e.text().toString())); 

und eine Liste zu filtern -

Observable.from(itemList) 
       .filter(item-> item.getName().toLowerCase().contains(search.toLowerCase())) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<Item>() { 
        @Override 
        public void onCompleted() { 
         Utils.crossfade(mProgressView, recyclerHotelOption); 
        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(Item item) { 
         if (mItemListAdapter == null) { 
          List<Item> itemList = new ArrayList<>(); 
          itemList.add(item); 
          mItemListAdapter = new ItemListAdapter(mActivity, itemList); 
          recyclerHotelOption.setAdapter(mItemListAdapter); 
          LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mActivity); 
          linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);       
          recyclerHotelOption.setLayoutManager(linearLayoutManager); 
         } else { 
          mItemListAdapter.notifyDataSetChanged(item); 
          recyclerHotelOption.getLayoutManager().scrollToPosition(0); 
         } 
        } 
       }); 

Wie beide kombinieren feste Liste von Elementen zu filtern?

aktualisieren

änderte ich den Code auf der Antwort basiert, aber es funktioniert immer noch nicht.

RxSearchView.queryTextChangeEvents(mSearchView) 
      .map(textViewTextChangeEvent -> textViewTextChangeEvent.toString().toLowerCase()) 
      .switchMap(s -> Observable.from(items) 
        .filter(item-> item.getItemName().toLowerCase().contains(s.toLowerCase())) 
        .toList()).subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<List<Item>>() { 
       @Override 
       public void onCompleted() { 
       } 

       @Override 
       public void onError(Throwable e) { 
       } 

       @Override 
       public void onNext(List<Item> items) { 
        mItemListAdapter.notifyDataSetChanged(items); 
        recyclerView.getLayoutManager().scrollToPosition(0); 
       } 
      }); 

Antwort

5

Ich würde es auf folgende Weise tun:

Observable<CharSequence> textChanges = RxTextView.textChangeEvents(editText); 
textChanges 
    .map(search -> search.toString().toLowerCase()) 
    .switchMap(search -> 
     Observable.from(itemList) 
      .filter(item -> item.getName().toLowerCase().contains(search)) 
      .toList() 
    ) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(
     new Observer<List<Item>>() { 
      // ... 
     }); 
+0

Können Sie den aktualisierten Code aussehen auf Ihre Antwort basiert. Es funktioniert immer noch nicht. – mjosh

+0

Was meinst du nicht funktioniert? Was ist das Problem? – Michael

+0

Die Liste filtert nicht basierend auf Textänderungen in 'SearchView'. – mjosh