2016-09-20 5 views
2

Некоторая логика должна выполняться в прослушивателе HorizontalScrollView, только если HorizontalScrollView был прокручен пользователем, а не я был тем, кто вызвал метод horizontalScrollView.scrollBy(dx, 0); на другой части кода.Решите, что прокрутка пользователя была инициирована пользователем или была запрограммирована программным способом?

С флагом - программный вызов был запущен, закончен - проблема не может быть исправлена, потому что существует небольшая задержка между вызовом метода вызова и триггером между scrollBy. Но в этот период даже пользователь мог коснуться и прокрутить HorizontalScrollView.

Какой подход вы бы предложили?

horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 

     @Override 
     public void onScrollChanged() { 

      if (horizontalState == 0) { 
       horizontalState = 2; 
      } 

      if (horizontalState == 2) { 

       int d = ...; 

       if (d != 0) { 
        userSettingRecycleView.scrollBy(d , 0); 

       } else { 
        horizontalState = 0; 
       } 
      } 
     } 
    }); 

userSettingRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener(){ 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy){ 

       if (horizontalState == 1) { 

        super.onScrolled(recyclerView, dx, dy); 
        horizontalScrollView.scrollBy(dx, 0); 
       } 
      } 

      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 

       if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { 

        ItemUserSettingRatingActivity.horizontalState = 1; 
       } 

       if (newState == RecyclerView.SCROLL_STATE_IDLE || newState == RecyclerView.SCROLL_STATE_SETTLING) { 
        ItemUserSettingRatingActivity.horizontalState = 0; 
       } 
      } 
     }); 

ответ

0

Я хотел бы предложить, чтобы отключить прикосновения пользователя в диапазоне между вашей программкой scrool событиями. То есть, используйте классы those, чтобы создать свой собственный HorisontalScrollView и включить/отключить захват кранов программным способом.

0

Использование SCROLL_STATE_DRAGGING

private val scrollListener = object : RecyclerView.OnScrollListener() { 
    override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) { 
     super.onScrollStateChanged(recyclerView, newState) 
     if (newState == SCROLL_STATE_DRAGGING) ViewHelpers.hideKeyboard(activity) 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^