2016-09-02 11 views
5

Mam EditText w Activity, gdzie użytkownicy mogą wpisywać i wyszukiwać rzeczy. Pod paskiem wyszukiwania mam 2 tabs dołączone do ViewPager. Dodałem detektor zmian zdarzeń RxJava dla EditText w 2 Fragments, który mam dla kart. Oto odpowiedni kod:Zdarzenie Fire RxJava zmienia się tylko wtedy, gdy Fragment jest widoczny w ViewPager

private Subscription subscription; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_people_search, container, false); 
     ButterKnife.bind(this, view); 
     LogUtil.i(TAG, "onCreateView called"); 

     if (getActivity() != null) { 
      inputSearch = (EditText) getActivity().findViewById(R.id.editText11); 
     } 

     return view; 
    } 

    @Override 
    public void onResumeFragment() { 
     LogUtil.i(TAG, "onResumeFragment called"); 
     if (subscription == null) { 
      doSearch(); 
     } 
    } 

    private void doSearch() { 
     LogUtil.i(TAG, "doSearch called"); 
     subscription = RxTextView.textChangeEvents(inputSearch) 
       .debounce(400, TimeUnit.MILLISECONDS) 
       .map(new Func1<TextViewTextChangeEvent, String>() { 
        @Override 
        public String call(TextViewTextChangeEvent textViewTextChangeEvent) { 
         return textViewTextChangeEvent.text().toString().trim(); 
        } 
       }) 
       .switchMap(new Func1<String, Observable<SearchUserData>>() { 
        @Override 
        public Observable<SearchUserData> call(String s) { 
         term = s; 
         if (previousTerm.equalsIgnoreCase(term) && TextUtils.isEmpty(term)) { 
          //do not reset pagination variables 
         } else if (!previousTerm.equalsIgnoreCase(term) && TextUtils.isEmpty(term)) { 
          min = 0; 
          max = 14; 
         } else if (previousTerm.equalsIgnoreCase(term) && !TextUtils.isEmpty(term)) { 
          //do not reset pagination variables 
         } else { 
          min = 0; 
          max = 14; 
         } 
         loadMoreOrNot = true; 
         previousTerm = term; 
         DiscoverAPI discoverAPI = restAdapter.create(DiscoverAPI.class); 
         return discoverAPI.getRxPeopleSearchResult(min, max, s, "user"); 
        } 
       }) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(getRxSearchObserver()); 
    } 

co chcę, kiedy szukać czegoś, zapytanie powinno przejść do backend tylko na karcie, która jest wybrana teraz, nie na obu kartach. Jak mogę to zrobić?

+1

ja nie rozumiem, co dokładnie chcesz zrobić Ale ** setUserVisibleHint ** jest wywoływana właśnie wtedy, gdy ViewPager jest widoczny dla użytkownika. – Amir

+0

Umieściłem pasek wyszukiwania na pasku narzędzi, gdy wpisujesz cokolwiek, zobaczysz wyniki w 2 kategoriach, osoby i galerie, w zależności od tego, która karta jest aktualnie wybrana. Problem w tym momencie polega na tym, że gdy tylko cokolwiek wpisuję, żądania wyszukiwania obu typów są uruchamiane. Chcę tylko, aby wyszukiwane hasła dla wybranej karty były uruchamiane. –

+0

Spróbuj zrezygnować z subskrypcji w usłudze onStop. – drivfe

Odpowiedz

1

Myślę, że są dwie opcje.

Użyj filtra:

subscription = RxTextView.textChangeEvents(inputSearch) 
      .debounce(400, TimeUnit.MILLISECONDS) 
      .filter(textViewTextChangeEvent -> getUserVisibleHint()) 
      .map(..) 
      ... 

Albo Subskrypcja/Rezygnuję gdy setUserVisibleHint nazywa (Jak komentował @Amir):

@Override 
    public void onResumeFragment() { 
     //don't subscribe here 
    } 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 

     if (subscription != null) { 
      subscription.unsubscribe(); 
      subscription = null; 
     } 
     if (isVisibleToUser) { 
      doSearch(); 
     } 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 

     if (subscription != null) { 
      subscription.unsubscribe(); 
      subscription = null; 
     } 
    } 
Powiązane problemy