Android之ListView分页加载数据功能实现代码
什么是listview分页加载数据功能呢?在现在的大数据时代,我们不可能把某些数据全部展示到界面,好比我们经常会看的qq空间一样,当你看动态的时候,系统不可能会把所有好友的动态都展示在上面,你能看到的一般都是最新好友更新的动态,假如你要看非最新的好友动态,通常你都会手指向上滑动屏幕然后去查看,当界面下滑到一定数量的时候,就会看到一个“查看更多”,然后突然停顿一下,系统会通过网络去给你刷新其他动态信息,这样的功能我们一般叫做数据下拉刷新功能,也就是我们的分页加载功能,具体的实现是怎样的呢?下面我们开始详细讲解。
实现的原理:
1. 首先要先确定默认展示在listview上的数据,比如默认在listview上展示10条数据。
2. 将数据传递到自定义的适配器上,然后加载到listview中。
3. 当用户将数据拉到最后一条的时候,就要开始刷新加载新数据了。
4. 通过监听listview的滑动事件,判断是否达到最后一条,如果达到最后一条则开始刷新。
详细的实现步奏在代码中详细讲解。
整体结构如下:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.company.listviewdeepknow.mainactivity"> <listview android:id="@+id/mlist" android:layout_width="match_parent" android:layout_height="match_parent"> </listview> </relativelayout>
foot_boot.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="70dp" android:gravity="center" android:orientation="horizontal"> <progressbar android:id="@+id/progressbar" style="?android:attr/progressbarstylesmall" android:layout_width="45dp" android:layout_height="45dp" /> <textview android:id="@+id/mload" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载更多..." android:textsize="20sp" /> </linearlayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <textview android:id="@+id/mtv1" android:layout_width="100dp" android:layout_height="100dp" android:textsize="20sp" /> <textview android:id="@+id/mtv2" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignparentright="true" android:textsize="20sp" /> </relativelayout>
mainactivity.java
public class mainactivity extends appcompatactivity implements myonscrolllistener.onloaddatalistener { //listview展示的数据项 private list<student> data; //listview控件 private listview mlist; //自定义适配器 myadapter adapter; //底部加载更多布局 view footer; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //首先加载默认数据,这里设置为10条 getdata(); //显示到listview上 showlistview(data); //自定义的滚动监听事件 myonscrolllistener onscrolllistener = new myonscrolllistener(footer, data); //设置接口回调 onscrolllistener.setonloaddatalistener(this); //设置listview的滚动监听事件 mlist.setonscrolllistener(onscrolllistener); } /** * 初始化listview数据,默认设置为10条 */ private void getdata() { data = new arraylist<>(); student stu = null; for (int i = 0; i < 10; i++) { stu = new student(); stu.setname("姓名" + i); stu.setsex(i % 2 == 0 ? "男" : "女"); data.add(stu); } } /** * 将数据加载到listview上 * * @param data */ private void showlistview(list<student> data) { //首先判断适配器是否为空,首次运行肯定是为空的 if (adapter == null) { //查到listview控件 mlist = (listview) findviewbyid(r.id.mlist); //将底部加载一个加载更多的布局 footer = layoutinflater.from(this).inflate(r.layout.foot_boot, null); //初始状态为隐藏 footer.setvisibility(view.gone); //加入到listview的底部 mlist.addfooterview(footer); //创建adpter数据 adapter = new myadapter(data); //设置adapter mlist.setadapter(adapter); } else { //不为空,则刷新数据 this.data = data; //提醒listview重新更新数据 adapter.notifydatasetchanged(); } } @override public void onloaddata(list<student> data) { //加载数据完成后,展示数据到listview showlistview(data); } }
myonscrolllistener.java
public class myonscrolllistener implements abslistview.onscrolllistener { //listview总共显示多少条 private int totalitemcount; //listview最后的item项 private int lastitem; //用于判断当前是否在加载 private boolean isloading; //底部加载更多布局 private view footer; //接口回调的实例 private onloaddatalistener listener; //数据 private list<student> data; public myonscrolllistener(view footer, list<student> data) { this.footer = footer; this.data = data; } //设置接口回调的实例 public void setonloaddatalistener(onloaddatalistener listener) { this.listener = listener; } /** * 滑动状态变化 * * @param view * @param scrollstate 1 scroll_state_touch_scroll是拖动 2 scroll_state_fling是惯性滑动 0scroll_state_idle是停止 , 只有当在不同状态间切换的时候才会执行 */ @override public void onscrollstatechanged(abslistview view, int scrollstate) { //如果数据没有加载,并且滑动状态是停止的,而且到达了最后一个item项 if (!isloading && lastitem == totalitemcount && scrollstate == scroll_state_idle) { //显示加载更多 footer.setvisibility(view.visible); handler handler = new handler(); //模拟一个延迟两秒的刷新功能 handler.postdelayed(new runnable() { @override public void run() { if (listener != null) { //开始加载更多数据 loadmoredata(); //回调设置listview的数据 listener.onloaddata(data); //加载完成后操作什么 loadcomplete(); } } }, 2000); } } /** * 当加载数据完成后,设置加载标志为false表示没有加载数据了 * 并且设置底部加载更多为隐藏 */ private void loadcomplete() { isloading = false; footer.setvisibility(view.gone); } /** * 开始加载更多新数据,这里每次只更新三条数据 */ private void loadmoredata() { isloading = true; student stu = null; for (int i = 0; i < 3; i++) { stu = new student(); stu.setname("新名字" + i); stu.setsex("新性别" + i); data.add(stu); } } /** * 监听可见界面的情况 * * @param view listview * @param firstvisibleitem 第一个可见的 item 的索引 * @param visibleitemcount 可以显示的 item的条数 * @param totalitemcount 总共有多少个 item */ @override public void onscroll(abslistview view, int firstvisibleitem, int visibleitemcount, int totalitemcount) { //当可见界面的第一个item + 当前界面多有可见的界面个数就可以得到最后一个item项了 lastitem = firstvisibleitem + visibleitemcount; //总listview的item个数 this.totalitemcount = totalitemcount; } //回调接口 public interface onloaddatalistener { void onloaddata(list<student> data); } }
myadapter.java
public class myadapter extends mybaseadapter<student> { public myadapter(list<student> data) { super(data); } @override public void setdata(viewholder holder, student t) { holder.settext(r.id.mtv1, t.getname()).settext(r.id.mtv2, t.getsex()); } }
mybaseadapter.java
public abstract class mybaseadapter<t> extends baseadapter { protected list<t> data; public mybaseadapter(list<t> data){ this.data = data; } @override public int getcount() { return data == null ? 0 : data.size(); } @override public object getitem(int position) { return data.get(position); } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder holder = viewholder.getholder(convertview,parent,position, r.layout.list_item); setdata(holder,data.get(position)); return holder.getconvertview(); } public abstract void setdata(viewholder holder,t t); }
viewholder.java
public class viewholder { private int position; private sparsearray<view> array; private view convertview; private context context; private viewholder(viewgroup parent, int position, int layout) { this.position = position; this.context = parent.getcontext(); convertview = layoutinflater.from(parent.getcontext()).inflate(layout, null); convertview.settag(this); array = new sparsearray<>(); } public static viewholder getholder(view convertview, viewgroup parent, int position, int layout) { if (convertview == null) { return new viewholder(parent, position, layout); } else { viewholder holder = (viewholder) convertview.gettag(); holder.position = position; return holder; } } public <t extends view> t getview(int viewid) { view view = array.get(viewid); if (view == null) { view = convertview.findviewbyid(viewid); array.put(viewid, view); } return (t) view; } public view getconvertview() { return convertview; } public viewholder settext(int viewid, string data) { textview tv = getview(viewid); tv.settext(data); return this; }
student.java
public class student { private string name; private string sex; public string getname() { return name; } public void setname(string name) { this.name = name; } public string getsex() { return sex; } public void setsex(string sex) { this.sex = sex; } }
除了myadapter.java mybaseadapter.java viewholder.java 以及 student.java实体类没有注解,其他两个主要实现类都已经注释了,关于自定义通用适配器的讲解,本篇不做讲解,如果想了解如何实现自定义通用适配器知识的可以查看:
下面可以看看效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Android 消息机制问题总结
下一篇: Java编程获取经纬度之间距离的方法
推荐阅读
-
Android之ListView分页加载数据功能实现代码
-
Android界面数据懒加载实现代码
-
Android之ListView分页加载数据功能实现代码
-
Android界面数据懒加载实现代码
-
Android程序开发之ListView 与PopupWindow实现从左向右滑动删除功能
-
Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多
-
Android实现基于滑动的SQLite数据分页加载技术(附demo源码下载)
-
Android基于ListView实现类似Market分页加载效果示例
-
Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多
-
Android listview动态加载列表项实现代码