在现在的SINA微博或者象twitter、dzone等网站中,当加载一个很长的列表时,往往都是先加载部分内容,然后当用户用拖拉条往下拖动时,再加载更多的内容。这里在android 中,可以用listview搭配线程实现同样的功能,举例如下:
首先设置footer部分,即在listview的下面设置footview,footview的模版如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:padding="3dp"
android:layout_height="fill_parent">
<TextView
android:id="@id/android:empty"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center"
android:padding="5dp"
android:text="Loading more days..."/>
</LinearLayout>
复制代码然后记得在加到adapter前,把footview加到listview中去
View footerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listfooter, null, false);
this.getListView().addFooterView(footerView);
this.setListAdapter(adapter);
复制代码然后,listview的onscroll方法如下:
Java代码:
this.getListView().setOnScrollListener(new OnScrollListener(){
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
String last=Integer.toString(lastInScreen);
Log.d("show",last);
String total=Integer.toString(totalItemCount);
Log.d("total",total);
if((lastInScreen == totalItemCount) && !(loadingMore)){
Thread thread = new Thread(null, loadMoreListItems);
thread.start();
}
}
});
Thread thread = new Thread(null, loadMoreListItems);
thread.start();
复制代码下面来分析下,其中,可以预先设置一个屏的listview能显示多少条记录,比如设置为5条,这里itemsPerPage=15,然后:
int lastInScreen = firstVisibleItem + visibleItemCount;
复制代码这里,获得每屏中最后一条数据的位置,比如一次先显示5条,则lastInScreen=5了。
if((lastInScreen == totalItemCount) && !(loadingMore)){
Thread thread = new Thread(null, loadMoreListItems);
thread.start();
}
复制代码这里是判断,如果是滚动了滚动条,并且用户以及功能浏览完了一次屏幕所需要的数目(比如5个),则启用线程序loadMoreListItems去处理,加载另外的新的5个了。
而如果没滚动,则第一次显示时,也要启用线程序loadMoreListItems去处理。下面看loadMoreListItems:
Java代码:
private Runnable loadMoreListItems = new Runnable() {
public void run() {
loadingMore = true;
myListItems = new ArrayList<String>();
//Simulate a delay, delete this on a production environment!
try { Thread.sleep(1000);
} catch (InterruptedException e) {}
//Get 15 new listitems
for (int i = 0; i < itemsPerPage; i++) {
myListItems.add("Date: " + (d.get(Calendar.MONTH)+ 1) + "/" + d.get(Calendar.DATE) + "/" + d.get(Calendar.YEAR) );
d.add(Calendar.DATE, 1);
}
runOnUiThread(returnRes);
}
;
复制代码在这个线程里,实际上就是用循环往listview中加日期,产生从当天时间起的若干个日期格式,然后调用runOnUiThread(returnRes);去更新UI主线程,注意 runOnUiThread是android提供的方法,可以帮助你在线程中执行UI更新操作。
Java代码:
private Runnable returnRes = new Runnable() {
public void run() {
if(myListItems != null && myListItems.size() > 0){
for(int i=0;i<myListItems.size();i++)
adapter.add(myListItems.get(i));
}
adapter.notifyDataSetChanged();
loadingMore = false;
}
};
复制代码在更新主线程中,十分简单,只不过往adapter中去增加元素,并且notifyDataSetChanged通知listview起变化了,并设置loadingMore=false,因为已经加载完了一次了。
分享到:
相关推荐
Listview中使用线程实现无限加载更多项目的功能
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容。此过程大致分以下几步...
我们这个项目的目标是收集很可能在多个项目中都有用的想法(而且很可能已经被其他独立程序员实现了),定义一批比较合理且扩展性比较好的一批intents和接口,提供基础但稳定有效的实现,可以被其他Android程序所应用...
这次就不上图了,例子太多太多了,想必大家都见过...具体应用:(只需要这样引用即可.)在Activity中的调用,相比大家都清楚,开个异步或线程进行加载数据,这里我简单说一下异步使用,线程同理.代码如下:先声明一点,
47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换特效
20.5.7 关于OpenGL ES 2.0的更多阅读材料 20.6 代码编译说明 20.7 小结 第21章 活动文件夹 21.1 探索活动文件夹 21.1.1 用户如何使用活动文件夹 21.1.2 构建活动文件夹 21.2 代码编译说明 ...
本项目是一套基于安卓的新闻资讯类网站安卓客户端项目源码,本站之前也发布和介绍过十多套关于本类型的项目源码,点击网站客户端和新闻资讯就可以看到,本项目ui比较精美,listview中的网络图片数据采用了异步加载,...
多线程下载以及断点续传的部分功能 ActivityGroup的使用和测试 Fragment的使用和测试 TabHost的使用和测试 Notification的各种支持的操作测试 图片修改:锐化、素描、怀旧等八九种样式的修改 PopupWindow的使用和...
20.5.7 关于OpenGL ES 2.0的更多阅读材料 20.6 代码编译说明 20.7 小结 第21章 活动文件夹 21.1 探索活动文件夹 21.1.1 用户如何使用活动文件夹 21.1.2 构建活动文件夹 21.2 代码编译说明 ...
47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换特效
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
3.列表ListView支持直接设置图片的URL,通过底层的多线程下载功能,可以轻松实现异步加载图片,并且不会感觉到卡顿。 4.列表框ListView自带下拉刷新、下拉加载的功能,在手机上加载2w条数据只需2秒。 5.APP上数据...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...