有关Listview分页以及判断Listview是否已经滚动到低端的一些探索
2014-05-27 00:18
543 查看
在体验其他设计优美的app时加载动画的假象让我以为Listview的最后一条item完全显示之后才正式加载,导致我走入了一个误区浪费了很长的一段时间,最终我也是妥协以最后一条item刚被暴露开始作为Listview滚动到底部的标志,也就是说无须费很大劲去实现一个并没有多大提升的细节了。期间当然发现了一些很好的解决办法,
其一(网上引用的代码,原始出处不详,故不注明了):
简而言之,这种办法就是判断第二次向上滑动时item的位置有没有变化,没有变化就说明已经到底了。很好的实现,也在一些app上看到过,并且做了一个橡皮筋类似ios下拉刷新那样的一个优化,但是对于android来说,个人不仅不认同橡皮筋似的下拉刷新,另外这种需要人为去加载感觉并不是一个很好的方法,所以直接放弃了。
其二(原始链接):
我不知道为什么原作者加上那么一句“判断最后一个item完全可见的计算方法”,很明显,这只能避免多次被调用,所以到这里的时候我感觉要放弃了,然后去看了两集唐顿回来再拿其他的app把玩,发现是自己逼自己走上那么一个误区。哪怕最后一个item才刚露出来就去加载下一分页的内容其实也没多少消耗反而提升了用户体验吧,无需长时等待,这也是方法一不好的那方面。所以最后对代码再加以简单的修改,增加一个滚动停止的判断:
这样可以保证在最后一个item可见但还没有停止滚动的时候是无法加载下一页的,稍微满足一下强迫症吧。忘了说,后来给Listview加了个footerView。
其一(网上引用的代码,原始出处不详,故不注明了):
private int getLastVisiblePosition = 0, lastVisiblePositionY = 0; friendsTimeLineMsgList.setOnScrollListener(new AbsListView.OnScrollListener() { boolean isLastRow = false; @Override public void onScrollStateChanged(AbsListView absListView, int scrollState) { if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { if (absListView.getLastVisiblePosition() == (absListView.getCount() - 1)) { Log.i(TAG, "scroll to bottom"); View v = (View) absListView.getChildAt(absListView.getChildCount() - 1); int[] location = new int[2]; v.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标 int y = location[1]; Log.e("x" + location[0], "y" + location[1]); if (absListView.getLastVisiblePosition() != getLastVisiblePosition && lastVisiblePositionY != y) { //第一次拖至底部 Toast.makeText(absListView.getContext(), "再次拖至底部,即可翻页", Toast.LENGTH_SHORT).show(); getLastVisiblePosition = absListView.getLastVisiblePosition(); lastVisiblePositionY = y; return; } else if (absListView.getLastVisiblePosition() == getLastVisiblePosition && lastVisiblePositionY == y) { //第二次拖至底部 Toast.makeText(absListView.getContext(), "已经至底部", Toast.LENGTH_SHORT).show(); } } //未滚动到底部,第二次拖至底部都初始化 getLastVisiblePosition = 0; lastVisiblePositionY = 0; } } }
简而言之,这种办法就是判断第二次向上滑动时item的位置有没有变化,没有变化就说明已经到底了。很好的实现,也在一些app上看到过,并且做了一个橡皮筋类似ios下拉刷新那样的一个优化,但是对于android来说,个人不仅不认同橡皮筋似的下拉刷新,另外这种需要人为去加载感觉并不是一个很好的方法,所以直接放弃了。
其二(原始链接):
private int preLast; // Initialization stuff. yourListView.setOnScrollListener(this); // ... ... ... @Override public void onScroll(AbsListView lw, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { switch(lw.getId()) { case android.R.id.list: // Make your calculation stuff here. You have all your // needed info from the parameters of this function. // Sample calculation to determine if the last // item is fully visible. final int lastItem = firstVisibleItem + visibleItemCount; if(lastItem == totalItemCount) { if(preLast!=lastItem){ //to avoid multiple calls for last item Log.d("Last", "Last"); preLast = lastItem; } } } }
我不知道为什么原作者加上那么一句“判断最后一个item完全可见的计算方法”,很明显,这只能避免多次被调用,所以到这里的时候我感觉要放弃了,然后去看了两集唐顿回来再拿其他的app把玩,发现是自己逼自己走上那么一个误区。哪怕最后一个item才刚露出来就去加载下一分页的内容其实也没多少消耗反而提升了用户体验吧,无需长时等待,这也是方法一不好的那方面。所以最后对代码再加以简单的修改,增加一个滚动停止的判断:
friendsTimeLineMsgList.setOnScrollListener(new AbsListView.OnScrollListener() { boolean isLastRow = false; @Override public void onScrollStateChanged(AbsListView absListView, int scrollState) { if (isLastRow && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) { //加载元素 isLastRow = false; // Toast.makeText(absListView.getContext(), "bottom", Toast.LENGTH_SHORT).show(); } } //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。 //firstVisibleItem:当前能看见的第一个列表项ID(从0开始) //visibleItemCount:当前能看见的列表项个数(小半个也算) //totalItemCount:列表项共数 @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { switch (absListView.getId()) { case R.id.friends_timeline_msglist: final int lastItem = firstVisibleItem + visibleItemCount; if (lastItem == totalItemCount) { if (preLast != lastItem) { //to avoid multiple calls for last item Log.d("Last", "Last"); showFooterView(); preLast = lastItem; isLastRow = true; } } } } });
这样可以保证在最后一个item可见但还没有停止滚动的时候是无法加载下一页的,稍微满足一下强迫症吧。忘了说,后来给Listview加了个footerView。
相关文章推荐
- ListView判断是否滚动,保存listview位置状态
- 不同浏览器对document.documentElement和document.body的scrollheight ,scrollTop,clientHeight以及判断滚动条是否滚动到页面最底部 【转载】
- 判断scroll是否滚动到底部以及实现回到顶部
- 判断是否为空struct以及清空已经赋值的struct和array及map
- 判断listview是否已经滑动到底部
- Android 记录ListView滚动的位置的三种方法及判断是否滑动到底部
- 判断一个数组是否已经排好序以及二分查找
- Android : 判断WebView是否已经滚动到页面底端
- listView判断是否滚动到底部
- Android 判断ListView是否在滚动到底部
- jQuery判断网页是否已经滚动到浏览器底部的实现方法
- 监听scroollview、listview、gridview页面滑动,判断是否滑动到顶部以及底部
- 通过图片链接地址判断图片有没缓存以及是否已经加载完成
- 判断iptables是否运行的一些探索
- shell中判断一些值是否已经在全列表中
- appium一些util 判断元素是否存在 以及 滑动
- 不同浏览器对document.documentElement和document.body的scrollheight ,scrollTop,clientHeight以及判断滚动条是否滚动到页面最底部 【转载】
- Android判断是否已经开启开发者调试模式以及引导用户去开启相应设置
- 【Android】ListView监听上下滑动(设置滚动监听判断ListView的滚动方向同时获取屏幕高度、ListView实际高度,判断是否需要展示返回顶部按钮(具体逻辑请看代码--附有详细注释)。
- H-UI的前端处理验证,判断是否已经存在,比较健全的模板,可以自己添加一些校验