Android之ListView分页加载数据功能实现代码

Android之ListView分页加载数据功能实现代码,第1张

概述什么是ListView分页加载数据功能呢?在现在的大数据时代,我们不可能把某些数据全部展示到界面,好比我们经常会看的QQ空间一样,当你看动态的时候,系统不可能会把所有好友的动态都展示在上面,你能看到的一般都是最

什么是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分页加载数据功能实现代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148555.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存