@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int visiblePosition = lv_res.getLastVisiblePosition(); if ((visiblePosition + 1) == totalItemCount ) { if (totalItemCount > 0) { lv_res.addFooterView(footerView); Logger.i(TAG, "加载数据了哦"); callServer(); } } }
这是重写的方法,callServer()方法是用来访问服务器获取数据,在主线程中执行,setOnScrollListener监听也是在主线程中执行的。看起来似乎没有错,其实错就错在这个监听重写的方法中,if ((visiblePosition + 1) == totalItemCount )这行代码意思是如果当前所显示的数据的position等于总的数据量,就是执行callServer()方法,所以如果从服务器拿到的数据总数还不够把整个界面填满的话,callServer()方法就会在主线程开启时执行一遍,onScroll()方法里又执行一遍,比较耗时,所以会拖住主线程。解决方法也很简单,把if()语句中加个判断即可:
if ((visiblePosition + 1) == totalItemCount && totalItemCount > visibleItemCount)
这个totalItemCount > visibleItemCount的意思就是说必须获得的数据的总数大于整个界面显示的总数才调用用callServer()方法,再从服务器加载一批数据。