onScrollStateChanged在Scroll_State_Idle时不会平滑滚动

问题描述:

我得到了一个listView,其中包含全屏中具有相同高度的多个项目。当我释放滚动时,我想自动滚动到该项目,这会占用屏幕上最多的空间。当我滚动到一个随机位置并点击一个按钮(例如,当firstVisible项目的60%可见并且以下项目的40%可见时,它会自动顺利滚动到第一个可见项目, OnClick)看代码:onScrollStateChanged在Scroll_State_Idle时不会平滑滚动

ListView mylistView= (ListView)findViewById(R.id.ListViewLayout); 
    int midScreen = mylistView.getMeasuredHeight()/2; 

    public void onClick(View v) { 

    View v = mylistView.getChildAt(0); 
    int top = (v == null) ? 0 : v.getTop(); 
    top =-top; 
    if (top <= midScreen) { 
     mylistView.smoothScrollBy(-top, 1000); // if first item takes more space, scroll up 
     } else { 
      mylistView.smoothScrollBy((midScreen*2)-top, 1000); // if second item takes more space, scroll down 
      } 

现在我想要这个工作过程被调用,当列表停止滚动。我创建了一个onScrollListener和onScrollStateChanged我想这如果listScroll停止(所以状态0,空闲):

 @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
      if (scrollState==OnScrollListener.SCROLL_STATE_IDLE) {     
       View vX = mylistView.getChildAt(0); 
       int top = (vX == null) ? 0 : vX.getTop(); 
       top =-top; 
       if (top <= midScreen) { 
        mylistView.smoothScrollBy(-top, 1000); 
       } else mylistView.smoothScrollBy((midScreen*2)-top, 1000); 
      } 
     } 

的问题:不是滚动平滑1秒到准确的位置,以显示全屏想要的项目,它跳得尽可能快。 smoothScrollBy在状态0中被调用时不再平滑。为什么是这样的,并且有没有解决方案?

好吧,我设法运行一个可处理的runnable中的smoothScroll,现在它的工作原理! 如果有人有同样的问题,这里来的代码

listViewAnlagen.setOnScrollListener(new OnScrollListener() { 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      } 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

      if (scrollState==OnScrollListener.SCROLL_STATE_IDLE) { 

       View vX = listViewAnlagen.getChildAt(0); 
       int top = (vX == null) ? 0 : vX.getTop(); 
       top =-top; 
       if (top <= mitteScreen) {      
        handler.post(obenRunnable); 
       } else { 
        handler.post(untenRunnable); 
        } 

      } 
     } 

     Handler handler = new Handler(); 
     Runnable obenRunnable = new Runnable() 
     { 
      public void run() 
      { 

       View vX = listViewAnlagen.getChildAt(0); 
       int top = (vX == null) ? 0 : vX.getTop(); 
       top =-top; 
       listViewAnlagen.smoothScrollBy(-top, 200); 
      } 
     }; 
     Runnable untenRunnable = new Runnable() 
     { 
      public void run() 
      { 
       View vX = listViewAnlagen.getChildAt(0); 
       int top = (vX == null) ? 0 : vX.getTop(); 
       top =-top; 
       listViewAnlagen.smoothScrollBy((mitteScreen*2)-top, 200); 
      } 
     }; 
    }); 

我想你可以做一些这样的事情,让顺利滚动。

public void scrollSmoothTopAfterMiddle(final int top) { 

    final ValueAnimator anim = ValueAnimator.ofInt(top, 0); 

    anim.addUpdateListener(new AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(final ValueAnimator animation) { 
      final int value = (Integer) animation.getAnimatedValue(); 

      mListView.smoothScrollBy((midScreen * 2) - top, value); 
     } 
    }); 

    anim.setDuration(250); 
    anim.setInterpolator(new DecelerateInterpolator()); 
    anim.start(); 
} 

public void scrollSmoothTopBeforeMiddle(final int top) { 

    final ValueAnimator anim = ValueAnimator.ofInt(top, 0); 

    anim.addUpdateListener(new AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(final ValueAnimator animation) { 
      final int value = (Integer) animation.getAnimatedValue(); 
      mListView.smoothScrollBy(-top, value); 
     } 
    }); 

    anim.setDuration(250); 
    anim.setInterpolator(new DecelerateInterpolator()); 
    anim.start(); 
} 

if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 

    final View vX = mListView.getChildAt(0); 

    int top = (vX == null) ? 0 : vX.getTop(); 

    top = -top; 

    if (top <= midScreen) { 

     scrollSmoothTopBeforeMiddle(-top); 
    } else { 

     scrollSmoothTopAfterMiddle((midScreen * 2) - top); 
    } 
} 
+0

谢谢@anderson_acs的帮助。我对代码进行了一些优化(只转发顶部:scrollSmoothTopAfterMiddle(顶部)),但现在它快速滚动而不像以前那样将动画移动到正确的位置,并且滚动所需的距离,但是SMOOTHLY。换句话说,我释放手指在滚动 - >右侧位置非平滑滚动 - >进一步滚动到右侧位置平滑滚动的距离。请问我是否表达自己的sl。。任何改进想法?再次感谢 – Simsala 2014-09-05 09:22:49

+0

@Simsala,我很抱歉,但我无法真正理解你想说什么,你试图增加哪些部分? – 2014-09-05 15:18:21