android listview分页简单实现
分页,开发应用中必不可少。那么,现在就来实现分页功能。
首先来想想实现它要有哪些步骤,
1, 实现的组件,
2、初始化第一页数据,
3,底部布局 ,
4,加载数据的条件
5、获取下一页的数据。
有了思路,我们一步步来实现就行了。先来想想我们用什么组件实现,我们知道列表ui我们常用listview或者recyclerview,初始化数据,我们就在通过一个for循环来准备数据,底部布局我们直接使progressbar控件和一个textview来显示就可以了。至于,加载的数据,我们就使用onscrolllistener来监听滑动事件,然后在满足加载条件时,我们就可以加载下一页的数据了。
先来看看listview实现:
自定义listview (loadlistview.java):
public class loadlistview extends listview implements abslistview.onscrolllistener{ private layoutinflater minflater; //判断是否滚动最后一行 private boolean islastrow = false; //底部view布局 private view mfooter; //实现接口加载更多数据 public onloadmorelistener morelistener; public void setloadmorelistener(onloadmorelistener morelistener){ this.morelistener = morelistener; } public loadlistview(context context) { super(context); initview(); } public loadlistview(context context, attributeset attrs) { super(context, attrs); initview(); } public loadlistview(context context, attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); initview(); } private void initview(){ minflater = layoutinflater.from(getcontext()); mfooter = minflater.inflate(r.layout. listview_footer,null); this.addfooterview(mfooter); mfooter.setvisibility(view.gone); setonscrolllistener(this); } @override public void onscrollstatechanged(abslistview abslistview, int scrollstate) { //正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollstate = 2的这次不回调 //回调顺序如下 //第1次:scrollstate = scroll_state_touch_scroll(1) 正在滚动 //第2次:scrollstate = scroll_state_fling(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) //第3次:scrollstate = scroll_state_idle(0) 停止滚动 //当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1; //由于用户的操作,屏幕产生惯性滑动时为2 //当滚到最后一行且停止滚动时,执行加载 if(islastrow&&scrollstate== onscrolllistener.scroll_state_idle){ mfooter.setvisibility(view.visible); islastrow = false; if(morelistener!=null){ morelistener.loadmore(); } } } @override public void onscroll(abslistview abslistview, int firstvisibleitem, int visibleitemcount, int totalitemcount) { //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。 //firstvisibleitem:当前能看见的第一个列表项id(从0开始) //visibleitemcount:当前能看见的列表项个数(小半个也算) //totalitemcount:列表项共数 //判断是否滚到最后一行 if (firstvisibleitem + visibleitemcount == totalitemcount && totalitemcount > 0) { islastrow = true; } } public interface onloadmorelistener{ void loadmore(); } }
底部布局listfooter.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="wrap_content" android:orientation="vertical"> <progressbar android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toleftof="@+id/id_loadmore" android:layout_marginright="5dp" /> <textview android:id="@+id/id_loadmore" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载更多" android:layout_centerhorizontal="true" android:layout_centervertical="true"/> </relativelayout>
mainactivity.java的源码:
public class mainactivity extends activity implements loadlistview.onloadmorelistener { private list<news> list = new arraylist<>() ; private loadadapter madapter; private loadlistview mlistview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); loadmoredata(); mlistview =(loadlistview) findviewbyid(r.id.id_list_view); madapter = new loadadapter(this,list); mlistview.setadapter(madapter); mlistview.setloadmorelistener(this); } private void loadmoredata(){ for(int i = 0 ; i <10;i++){ news news = new news(); news.settitle("许巍"); news.setcontent("蓝莲花"); list.add(news); } } @override public void loadmore() { new handler().postdelayed(new runnable() { @override public void run() { loadmoredata(); showloadmore(); } },2000); } private void showloadmore(){ madapter.notifydatasetchanged(); } }
loadadapter.java
public class loadadapter extends baseadapter { private list<news> list; private context mcontext; public loadadapter(context context,list<news> list){ this.list = list; this.mcontext = context; } @override public int getcount() { return list.size(); } @override public object getitem(int position) { return position; } @override public long getitemid(int position) { return position; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder viewholder; if(convertview==null){ viewholder = new viewholder(); convertview = layoutinflater.from(mcontext).inflate(r.layout.item_news,null); viewholder.title = (textview) convertview.findviewbyid(r.id.id_title); viewholder.content = (textview)convertview.findviewbyid(r.id.id_content); convertview.settag(viewholder); }else { viewholder = (viewholder) convertview.gettag(); } viewholder.title.settext(list.get(position).gettitle()); viewholder.content.settext(list.get(position).getcontent()); return convertview; } public class viewholder{ private textview title; private textview content; } }
activity_main.xml:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <view.loadlistview android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/id_list_view" /> </linearlayout>
item_news.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="match_parent" android:orientation="vertical"> <textview android:id="@+id/id_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:gravity="center" android:padding="5dp"/> <textview android:id="@+id/id_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" android:gravity="center" android:padding="5dp"/> </linearlayout>
其实只要掌握了onscrolllistener的回调,那么就很简单了。recyclerview也出现很久了,慢慢的,recyclerview也会替代了listview,所以listview分页似乎就过时了,我们想知道的是recyclerview怎么实现分页。但是我们知道recyclerview不能实现头部和底部的添加,所以我们要自己来实现一个能添加头部和底部的reyclerview。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
如对本文有疑问, 点击进行留言回复!!
网友评论