完美解决smoothScrollToPosition(0)失效的问题
2019-11-09 14:48:45
供稿:网友
我们知道,当调用smoothScrollToPosition(0)方法,listView会快速的平滑的滑动到顶部。但是当listView加载的数据list太多的时候,这个方法就会失效,据网上的介绍,是因为这个方法会消耗太多的资源,所以不能完全处理完所有的items 回到顶部。于是就滑动到一个不确定的位置。那怎么解决这个问题呢,有两个方法可供选择:方法一:使用setSelection(0)来代替。这个方法是有效的,但是是瞬间跳到了0 的位置,丧失了平滑性,为了弥补这个方法的缺陷,可以先setselection到0附近的位置,比如setSelection(3),然后再调用smoothScrollToPosition(0),这样的效果就是listview啪的一下跳到了3的位置,然后紧接着平滑的滑动到了0的位置。方法二:为ListView添加OnScrollListener监听,ListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { Common.Log_i("onScrollStateChanged"); if (scrollState== AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { if (ListView.getFirstVisiblePosition() != 0) { ListView.smoothScrollToPosition(0); } else { ListView.setOnScrollListener(null); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Common.Log_i("onScroll"); } });ListView.smoothScrollToPosition(0);既可。onScrollStateChanged方法中的scrollState参数是标记滑动状态的,一共有三种状态:OnScrollListener.SCROLL_STATE_IDLE:滚动停止时的状态OnScrollListener.SCROLL_STATE_STOUCH_SCROLL:触摸正在滚动,手指还没离开界面时的状态OnScrollListener.SCROLL_STATE_FLING:用户在用力滑动后,ListView由于惯性将继续滑动时的状态这里使用SCROLL_STATE_IDLE.一旦滑动停下来了,就判断当前显示的第一个item下标是不是0,不是的话接着smoothScrollToPosition(0),这样不管每次滑动到了哪个位置,只要停下来后检测倒不是顶部就会马上继续滑动,一直到回到顶部,停止。完美解决。注意,这段代码一定要放在onScrollStateChanged方法中调用,如果放在onScroll方法中,也会实现这个功能,但是整个过程是快速的卡顿着滑动到顶部的。这是因为只要在滑动onScroll就会执行,所以明明这一个smoothScroll还没有结束,就又发起了一次smoothscroll,马儿明明在好好的跑,你却要抽鞭子,它能不疼的停下来跳个高嘛。