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ć?
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
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. –
Spróbuj zrezygnować z subskrypcji w usłudze onStop. – drivfe