完美解決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,馬兒明明在好好的跑,你卻要抽鞭子,它能不疼的停下來跳個高嘛。