2016-09-02 9 views
5

में दिखाई दे रहा है मेरे पास Activity में है जहां उपयोगकर्ता चीजों को टाइप और खोज सकते हैं। खोज बार के नीचे, मेरे पास ViewPager से जुड़ा 2 tabs है। मैंने EditText के लिए Fragments में एक RxJava ईवेंट चेंज श्रोता जोड़ा है जो मेरे पास टैब के लिए है। यहाँ प्रासंगिक कोड है:फायर आरएक्सजेवा घटना केवल तभी बदलती है जब Fragment 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()); 
    } 

क्या मैं चाहता हूँ, जब मैं कुछ और खोज क्वेरी बैकएंड के लिए एक ही टैब जो अभी दोनों टैब के लिए चुना जाता है, नहीं करने के लिए जाना चाहिए। मैं यह कैसे कर सकता हूँ?

+1

मुझे समझ नहीं आता कि वास्तव में आप क्या करना लेकिन करना चाहते हैं क्या ** setUserVisibleHint ** को तब कॉल किया जाता है जब ViewPager उपयोगकर्ता के लिए दृश्यमान होता है। – Amir

+0

मैंने टूलबार में एक खोज बार डाला है, जब आप कुछ टाइप करते हैं, तो आप वर्तमान में कौन से टैब को चुनते हैं, इस पर निर्भर करते हुए आप 2 श्रेणियों, लोगों और दीर्घाओं में परिणाम देखते हैं। मुद्दा अभी है, जब भी मैं कुछ टाइप करता हूं, दोनों प्रकार के लिए खोज अनुरोध निकाल दिए जाते हैं। मैं केवल चयनित टैब के लिए खोज क्वेरी चाहता हूं। –

+0

ऑनस्टॉप में सदस्यता से सदस्यता रद्द करने का प्रयास करें। – drivfe

उत्तर

1

मुझे लगता है कि दो विकल्प हैं।

उपयोग फिल्टर:

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

या/सदस्यता समाप्त सब्सक्राइब setUserVisibleHint कहा जाता है (@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; 
     } 
    } 
संबंधित मुद्दे