有关Listview分页以及判断Listview是否已经滚动到低端的一些探索

在体验其他设计优美的app时加载动画的假象让我以为Listview的最后一条item完全显示之后才正式加载,导致我走入了一个误区浪费了很长的一段时间,最终我也是妥协以最后一条item刚被暴露开始作为Listview滚动到底部的标志,也就是说无须费很大劲去实现一个并没有多大提升的细节了。期间当然发现了一些很好的解决办法,

其一(网上引用的代码,原始出处不详,故不注明了):


 1 private int getLastVisiblePosition = 0, lastVisiblePositionY = 0;
2
3 friendsTimeLineMsgList.setOnScrollListener(new AbsListView.OnScrollListener() {
4 boolean isLastRow = false;
5 @Override
6 public void onScrollStateChanged(AbsListView absListView, int scrollState) {
7 if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
8 if (absListView.getLastVisiblePosition() == (absListView.getCount() - 1)) {
9 Log.i(TAG, "scroll to bottom");
10
11 View v = (View) absListView.getChildAt(absListView.getChildCount() - 1);
12 int[] location = new int[2];
13 v.getLocationOnScreen(location);//获取在整个屏幕内的绝对坐标
14 int y = location[1];
15 Log.e("x" + location[0], "y" + location[1]);
16 if (absListView.getLastVisiblePosition() != getLastVisiblePosition
17 && lastVisiblePositionY != y) {
18 //第一次拖至底部
19 Toast.makeText(absListView.getContext(), "再次拖至底部,即可翻页", Toast.LENGTH_SHORT).show();
20 getLastVisiblePosition = absListView.getLastVisiblePosition();
21 lastVisiblePositionY = y;
22 return;
23 } else if (absListView.getLastVisiblePosition() == getLastVisiblePosition
24 && lastVisiblePositionY == y) {
25 //第二次拖至底部
26 Toast.makeText(absListView.getContext(), "已经至底部", Toast.LENGTH_SHORT).show();
27 }
28 }
29 //未滚动到底部,第二次拖至底部都初始化
30 getLastVisiblePosition = 0;
31 lastVisiblePositionY = 0;
32 }
33
34 }
35 }

简而言之,这种办法就是判断第二次向上滑动时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才刚露出来就去加载下一分页的内容其实也没多少消耗反而提升了用户体验吧,无需长时等待,这也是方法一不好的那方面。所以最后对代码再加以简单的修改,增加一个滚动停止的判断:


 1         friendsTimeLineMsgList.setOnScrollListener(new AbsListView.OnScrollListener() {
2 boolean isLastRow = false;
3 @Override
4 public void onScrollStateChanged(AbsListView absListView, int scrollState) {
5 if (isLastRow && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
6 //加载元素
7 isLastRow = false;
8 // Toast.makeText(absListView.getContext(), "bottom", Toast.LENGTH_SHORT).show();
9 }
10
11 }
12
13 //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。
14 //firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
15 //visibleItemCount:当前能看见的列表项个数(小半个也算)
16 //totalItemCount:列表项共数
17 @Override
18 public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
19 switch (absListView.getId()) {
20 case R.id.friends_timeline_msglist:
27
28 final int lastItem = firstVisibleItem + visibleItemCount;
29 if (lastItem == totalItemCount) {
30 if (preLast != lastItem) { //to avoid multiple calls for last item
31 Log.d("Last", "Last");
32 showFooterView();
33 preLast = lastItem;
34 isLastRow = true;
35 }
36 }
37 }
38 }
39 });

这样可以保证在最后一个item可见但还没有停止滚动的时候是无法加载下一页的,稍微满足一下强迫症吧。忘了说,后来给Listview加了个footerView。

有关Listview分页以及判断Listview是否已经滚动到低端的一些探索,布布扣,bubuko.com

时间: 2024-10-24 08:56:39

有关Listview分页以及判断Listview是否已经滚动到低端的一些探索的相关文章

android 的ListView中,如何判断其内容已滚动到最顶部或者最底部?

根据这个方法检测: 1 getListView().setOnScrollListener(new OnScrollListener() { 2 @Override 3 public void onScrollStateChanged(AbsListView view, int scrollState) { 4 } 5 6 @Override 7 public void onScroll(AbsListView view, int firstVisibleItem, int visibleIte

Android ListView分页,动态添加数据

1.ListView分页的实现,重点在于实现OnScrollListener接口,判断滑动到最后一项时,是否还有数据可以加载, 我们可以利用listView.addFootView(View v)方法进行提示 自定义一个ListView(这里本来想进行一些自定已修改的...实际代码并没有做)CornerListView package com.example.testlistview; import android.widget.AbsListView; import android.conte

Android ListView分页加载(服务端+android端)Demo

Android ListView分页加载功能 在实际开发中经常用到,是每个开发者必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了测试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源代码: 服务端: 需要导入图中这几个jar包. 在运行Android端代码前,需要开启服务端: 下面先给出服务端的代码: 类EmpDataSource: package com.android

android listview左右滑动分页(viewpager嵌套listview进行分页),焦点图带圆焦点

1.先上图后说话 2.代码 package com.example.exmp; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import and

android中listview分页载入数据

前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方案有三种:1,假设自己定义适配器,那么在getView方法中推断contentView是否为空,假设为空创建contentView并返回,假设不为空直接返回contentView.这样能尽可能少创建view.2.给contentView设置tag,传入一个viewHoder对象,用于缓存要实现的数据

Android ListView分页载入(服务端+android端)Demo

Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源码: 服务端: 须要导入图中这几个jar包. 在执行Android端代码前,须要开启服务端: 以下先给出服务端的代码: 类EmpDataSource: package com.andr

ListView分页加载数据

在android软件开发中,ListView是一种经常被用到的组件.当需要用到列表显示的时候,通常都会用到.而使用的过程中也可能出现一些问题.比如,一次性加载过多的Item对于手机有限的内存来说,是一种负担.于是就有了分页加载的技术,一般的说,分页的使用方式有两种,一是在滑动到底部的时候,自动加载下一部分的内容.另一种则是在底部添加一个类似按钮的控件,点击后加载内容.这里介绍的是第一种.同样的,代码来自github,网址是:https://github.com/nicolasjafelle/Pa

listview分页载入问题

方案一: 底部有查看很多其它能够使用HeaderViewListAdapter 假设须要加入数据, 就向Adapter绑定的数据里面加入. 然后调用Adapter.notifyDataSetChanged()方法, ListView会自己主动刷新; public class HeaderViewListAdapter extends Object implements Filterable WrapperListAdapter java.lang.Object    ? android.widg

.Net程序员玩转Android开发---(16)ListView分页事件

ListView在加载是数据的时候,如果一次性把所有数据都加载出来,这样如果数据量大的话,效率低,性能差,通常情况下采取的措施是分页加载,只加载当前页数量的数据.这一节我们演示下ListView怎么分页加载数据.首先看下效果图 1. 创建加载进度栏 ListVIew每次加载的时候,会在底部有一个加载进度条栏,显示加载中,我们创建一个这样的布局文件,代码如下 <?xml version="1.0" encoding="utf-8"?> <Linear