2016-11-13 181 views
2

我是新來Rx世界,並試圖實現我AutoCompleteTextViewRxJavaRxBindingRetrofit 2AutoCompleteTextView與改造2,RxJava和RxBinding

這是我想出這是很麻煩:(也許我沒有做正確的方式)

我有一個AutoCompleteTextView這裏我建立了我的訂閱新資料和觀測:

subcription = RxTextView.textChangeEvents(clearableEditText) 
       .skip(1) 
       .debounce(400, TimeUnit.MILLISECONDS) 
       .map(new Func1<TextViewTextChangeEvent, String>() { 
        @Override 
        public String call(TextViewTextChangeEvent textViewTextChangeEvent) { 
         return textViewTextChangeEvent.text().toString(); 
        } 
       }) 
       .filter(new Func1<String, Boolean>() { 
        @Override 
        public Boolean call(String s) { 
         return s.length() > 2; 
        } 
       }) 
       .flatMap(new Func1<String, Observable<List<String>>>() { 
        @Override 
        public Observable<List<String>> call(String text) { 
         return searchService.getAutoCompleteTermsObservable(text) 
           .subscribeOn(Schedulers.io()) 
           .observeOn(AndroidSchedulers.mainThread()); 
        } 
       }) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<String>>() { 
        @Override 
        public void onCompleted() { 
         Log.d("rx", "oncomplete"); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Log.e("rx", e.toString()); 
        } 

        @Override 
        public void onNext(List<String> strings) { 
         Log.d("rx", strings.size()+""); 
         autoAdapter = new ArrayAdapter<>(MainActivity.this, 
           android.R.layout.simple_dropdown_item_1line, strings); 
         clearableEditText.setAdapter(autoAdapter); 
         clearableEditText.showDropDown(); 
        } 
       }); 

我的問題是當我用setText()方法設置我的EditText時,它會觸發下拉菜單。例如,當我從AutoCompleteTextView的下拉菜單中設置單詞時,以及當我使用語音輸入設置單詞時。當我手動設置時,是否有辦法避免觸發onTextChanged?或者我該如何解決這個問題?

+2

的問題是檢查,當你設置的文本時,可觀察到發射的情況下,嘗試退訂設置文本之前,之後重新訂閱。 – AndroidRuntimeException

+0

是的,就這麼簡單!謝謝@AgustinSivoplás。 –

+0

很高興幫助!祝一切順利! – AndroidRuntimeException

回答

1

你確實可以使用unsubscribe()但取決於你如何設置的值,也可以使用skipWhile。下面是一個例子:

public void handleTextChanges() { 
    final String textFromSource = "an"; 

    Observable.fromArray("a", "an", "ancestor") 
      .skipWhile(new Predicate<String>() { 
       @Override 
       public boolean test(String value) throws Exception { 
        return textFromSource.contains(value); 
       } 
      }) 
      .subscribe(new Consumer<String>() { 
       @Override 
       public void accept(String value) throws Exception { 
        Log.d("Rx", value); 
       } 
      }); 
} 

這隻會消耗ancestor(例如是RxJava2,但相同的方法存在)。任何後續值,即使它們匹配an,都將被消耗。你可以使用filter如果你總是想要做這樣的

+0

感謝您的替代方法@Jordy Langen。但是,這不是一個不必要的網絡要求嗎? –

+0

只要不是第一truthy值在'skipWhile' –

+0

被匹配當我從自動完成下拉列表中選擇項目時,它會叫的setText與價值,因爲它觸發onTextChange,它會讓只有一個請求得到自動完成建議和skipWhile,下拉將不會顯示。與語音輸入一樣,我會調用setText,這次它可能會或可能不會匹配,但在這些情況下,下拉將不會顯示。是的,實際上,這種方法似乎比我的setTextSafely()方法更乾淨。我在幾個地方調用了這個方法,所以如果我想讓自動填充用戶界面,你的方式會給我靈活性。謝謝,@Jordy Langen –