什么是ListVIEw分页加载数据功能呢?在现在的大数据时代,我们不可能把某些数据全部展示到界面,好比我们经常会看的QQ空间一样,当你看动态的时候,系统不可能会把所有好友的动态都展示在上面,你能看到的一般都是最新好友更新的动态,假如你要看非最新的好友动态,通常你都会手指向上滑动屏幕然后去查看,当界面下滑到一定数量的时候,就会看到一个“查看更多”,然后突然停顿一下,系统会通过网络去给你刷新其他动态信息,这样的功能我们一般叫做数据下拉刷新功能,也就是我们的分页加载功能,具体的实现是怎样的呢?下面我们开始详细讲解。
实现的原理:
1. 首先要先确定默认展示在ListVIEw上的数据,比如默认在ListVIEw上展示10条数据。
2. 将数据传递到自定义的适配器上,然后加载到ListVIEw中。
3. 当用户将数据拉到最后一条的时候,就要开始刷新加载新数据了。
4. 通过监听ListVIEw的滑动事件,判断是否达到最后一条,如果达到最后一条则开始刷新。
详细的实现步奏在代码中详细讲解。
整体结构如下:
activity_main.xml
<?xml version="1.0" enCoding="utf-8"?><@R_502_4614@Layout 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></@R_502_4614@Layout>
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" 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"?><@R_502_4614@Layout 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" /></@R_502_4614@Layout>
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 layout) { if (convertVIEw == null) { return new VIEwHolder(parent,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之ListView分页加载数据功能实现代码全部内容,希望文章能够帮你解决Android之ListView分页加载数据功能实现代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)