2016-09-20 2 views
2

Einige Logik muss in einem HorizontalScrollView Listener nur ausgeführt werden, wenn HorizontalScrollView wurde durch den Benutzer gescrollt, und nicht ich war, wer horizontalScrollView.scrollBy(dx, 0); Methode an anderen Code-Teil aufgerufen.Entscheiden Sie ob scroll vom Benutzer initiiert oder programmgesteuert ausgelöst wurde?

Mit Flag - Programmatic Call wurde gestartet, fertig - kann das Problem nicht wirklich beheben, weil es eine kleine Verzögerung zwischen scrollBy Methodenaufruf und auslösenden Ereignishandler gibt. Aber in diesem Zeitraum konnte sogar der Benutzer HorizontalScrollView berühren und scrollen.

Welchen Ansatz würden Sie vorschlagen?

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; 
       } 
      } 
     }); 

Antwort

0

würde ich vorschlagen, Benutzer berührt in Bereich zwischen Ihrem Programm scrool Ereignisse zu deaktivieren. Das heißt, verwenden Sie those Klassen, um Ihre benutzerdefinierte HorisontalScrollView zu erstellen und zu aktivieren/deaktivieren Sie den Fang auf programmatische Weise.

0

Verwenden 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) 
    } 
} 
Verwandte Themen