完美解决smoothScrollToPosition(0)失效的问题

来源:互联网 发布:软件导刊杂志社 编辑:程序博客网 时间:2024/04/29 10:34
我们知道,当调用
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,马儿明明在好好的跑,你却要抽鞭子,它能不疼的停下来跳个高嘛。
0 0
原创粉丝点击