`
abc20899
  • 浏览: 908972 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android_Listview中使用线程实现无限加载更多项目的功能

阅读更多
在现在的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中使用线程实现无限加载更多项目的功能

    Listview中使用线程实现无限加载更多项目的功能

    Android使用listview实现分页刷新(线程休眠模拟)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容。此过程大致分以下几步...

    Android UI组件实例集合

    我们这个项目的目标是收集很可能在多个项目中都有用的想法(而且很可能已经被其他独立程序员实现了),定义一批比较合理且扩展性比较好的一批intents和接口,提供基础但稳定有效的实现,可以被其他Android程序所应用...

    androidListView的上部下拉刷新下部点击加载更多具体实现及拓展

    这次就不上图了,例子太多太多了,想必大家都见过...具体应用:(只需要这样引用即可.)在Activity中的调用,相比大家都清楚,开个异步或线程进行加载数据,这里我简单说一下异步使用,线程同理.代码如下:先声明一点,

    android初学者入门项目

    47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换特效

    精通ANDROID 3(中文版)1/2

    20.5.7 关于OpenGL ES 2.0的更多阅读材料  20.6 代码编译说明  20.7 小结  第21章 活动文件夹  21.1 探索活动文件夹  21.1.1 用户如何使用活动文件夹  21.1.2 构建活动文件夹  21.2 代码编译说明  ...

    Android应用源码酷商城新闻类客户端项目

    本项目是一套基于安卓的新闻资讯类网站安卓客户端项目源码,本站之前也发布和介绍过十多套关于本类型的项目源码,点击网站客户端和新闻资讯就可以看到,本项目ui比较精美,listview中的网络图片数据采用了异步加载,...

    Android各种常用的功能测试

    多线程下载以及断点续传的部分功能 ActivityGroup的使用和测试 Fragment的使用和测试 TabHost的使用和测试 Notification的各种支持的操作测试 图片修改:锐化、素描、怀旧等八九种样式的修改 PopupWindow的使用和...

    精通Android 3 (中文版)2/2

    20.5.7 关于OpenGL ES 2.0的更多阅读材料  20.6 代码编译说明  20.7 小结  第21章 活动文件夹  21.1 探索活动文件夹  21.1.1 用户如何使用活动文件夹  21.1.2 构建活动文件夹  21.2 代码编译说明  ...

    android开发demo集合

    47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换特效

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    OrangeUI 1.74 D10.1&D10;.1.2&D10;.2.2 包含安装文档和DEMO, XE10.2编译通过

    3.列表ListView支持直接设置图片的URL,通过底层的多线程下载功能,可以轻松实现异步加载图片,并且不会感觉到卡顿。 4.列表框ListView自带下拉刷新、下拉加载的功能,在手机上加载2w条数据只需2秒。 5.APP上数据...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

Global site tag (gtag.js) - Google Analytics