Android开发中Listview动态加载数据的方法示例
程序员文章站
2023-12-04 09:02:10
本文实例讲述了android开发中listview动态加载数据的方法。分享给大家供大家参考,具体如下:
最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数...
本文实例讲述了android开发中listview动态加载数据的方法。分享给大家供大家参考,具体如下:
最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好。我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间。网上看到了这样一个例子,挺好的,我改动了一下,达到了我想要的结果。
java代码:
package org.developerworks.android; import android.app.activity; import android.os.bundle; import android.os.handler; import android.os.message; import android.view.gravity; import android.view.view; import android.view.viewgroup; import android.widget.abslistview; import android.widget.baseadapter; import android.widget.linearlayout; import android.widget.listview; import android.widget.progressbar; import android.widget.textview; import android.widget.toast; import android.widget.abslistview.onscrolllistener; import android.widget.linearlayout.layoutparams; public class listviewforloading extends activity implements onscrolllistener { private listviewadapter adapter = new listviewadapter(); listview listview; linearlayout loadinglayout; private thread mthread; /** * 设置布局显示属性 */ private layoutparams mlayoutparams = new linearlayout.layoutparams( linearlayout.layoutparams.wrap_content, linearlayout.layoutparams.wrap_content); /** * 设置布局显示目标最大化属性 */ private layoutparams fflayoutparams = new linearlayout.layoutparams( linearlayout.layoutparams.fill_parent, linearlayout.layoutparams.fill_parent); private progressbar progressbar; /** called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); init(); } private void init() { // todo auto-generated method stub // 线性布局 linearlayout layout = new linearlayout(this); // 设置布局 水平方向 layout.setorientation(linearlayout.horizontal); // 进度条 progressbar = new progressbar(this); // 进度条显示位置 progressbar.setpadding(0, 0, 15, 0); // 把进度条加入到layout中 layout.addview(progressbar, mlayoutparams); // 文本内容 textview textview = new textview(this); textview.settext("加载中..."); textview.setgravity(gravity.center_vertical); // 把文本加入到layout中 layout.addview(textview, fflayoutparams); // 设置layout的重力方向,即对齐方式是 layout.setgravity(gravity.center); // 设置listview的页脚layout loadinglayout = new linearlayout(this); loadinglayout.addview(layout, mlayoutparams); loadinglayout.setgravity(gravity.center); // 得到一个listview用来显示条目 listview = (listview) findviewbyid(r.id.tv); // 添加到脚页显示 listview.addfooterview(loadinglayout); // 给listview添加适配器 listview.setadapter(adapter); // 给listview注册滚动监听 listview.setonscrolllistener(this); } /** * 要用用于生成显示数据 * * @author huangbq */ class listviewadapter extends baseadapter { int count = 10; public int getcount() { return count; } public object getitem(int pos) { return pos; } public long getitemid(int pos) { return pos; } public view getview(int pos, view v, viewgroup p) { textview view; if (v == null) { view = new textview(listviewforloading.this); } else { view = (textview) v; } view.settext("listitem " + pos); view.settextsize(20f); view.setgravity(gravity.center); view.setheight(60); return view; } } @override public void onscroll(abslistview view, int firstvisibleitem, int visibleitemcount, int totalitemcount) { // todo auto-generated method stub if (firstvisibleitem + visibleitemcount == totalitemcount) { // 开线程去下载网络数据 if (mthread == null || !mthread.isalive()) { mthread = new thread() { @override public void run() { try { // 这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理 thread.sleep(5000); } catch (interruptedexception e) { e.printstacktrace(); } message message = new message(); message.what = 1; handler.sendmessage(message); } }; mthread.start(); } } } @override public void onscrollstatechanged(abslistview view, int scrollstate) { // todo auto-generated method stub } private handler handler = new handler() { @override public void handlemessage(message msg) { // todo auto-generated method stub switch (msg.what) { case 1: if (adapter.count <= 41) { adapter.count += 10; int currentpage = adapter.count / 10; toast.maketext(getapplicationcontext(), "第" + currentpage + "页", toast.length_long).show(); } else { listview.removefooterview(loadinglayout); } // 重新刷新listview的adapter里面数据 adapter.notifydatasetchanged(); break; default: break; } } }; }
main.xml别忘了加这段了
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <listview android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </linearlayout>
更多关于android相关内容感兴趣的读者可查看本站专题:《android控件用法总结》、《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android数据库操作技巧总结》及《android资源操作技巧汇总》
希望本文所述对大家android程序设计有所帮助。
下一篇: APP软件对网络推广的作用
推荐阅读
-
Android开发中自定义ProgressBar控件的方法示例
-
Android开发之底图局部加载移动的方法示例
-
Android开发中Listview动态加载数据的方法示例
-
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
-
Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】
-
Android ListView中headerview的动态显示和隐藏的实现方法
-
Android开发实现webview中img标签加载本地图片的方法
-
Android开发中button按钮的使用及动态添加组件方法示例
-
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
-
Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】