2016-09-02 14 views
5

Tôi có một EditText trong một Activity nơi người dùng có thể nhập và tìm kiếm mọi thứ. Bên dưới thanh tìm kiếm, tôi có 2 tabs được đính kèm với một số ViewPager. Tôi đã thêm trình xử lý thay đổi sự kiện RxJava cho số EditText vào 2 Fragments mà tôi có cho các tab. Đây là mã có liên quan:Thay đổi sự kiện Fire RxJava chỉ khi Fragment hiển thị trong 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()); 
    } 

Những gì tôi muốn là, khi tôi tìm kiếm một cái gì đó, truy vấn nên đi vào backend chỉ cho tab được chọn ngay bây giờ, không phải cho tất cả các tab. Tôi có thể làm cái này như thế nào?

+1

Tôi không hiểu chính xác những gì bạn muốn làm Nhưng ** setUserVisibleHint ** được gọi chỉ khi ViewPager hiển thị cho người dùng. – Amir

+0

Tôi đã đặt thanh tìm kiếm trên thanh công cụ, khi bạn nhập bất kỳ thứ gì, bạn sẽ thấy kết quả trong 2 danh mục, con người và thư viện, tùy thuộc vào tab nào hiện được chọn. Vấn đề hiện tại là, bất cứ khi nào tôi gõ bất cứ điều gì, các yêu cầu tìm kiếm cho cả hai loại đều được kích hoạt. Tôi chỉ muốn truy vấn tìm kiếm cho tab đã chọn được kích hoạt. –

+0

Hãy thử hủy đăng ký khỏi đăng ký trong onStop. – drivfe

Trả lời

1

Tôi nghĩ có hai tùy chọn.

Sử dụng bộ lọc:

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

hoặc đăng ký/hủy đăng ký khi setUserVisibleHint được gọi là (Theo nhận xét của @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; 
     } 
    } 
Các vấn đề liên quan