首先还是做一个listview,这次我们的数据使用一个自定义的类来定义,这个类只有两个属性

package com.example.listviewtest03;public class News {String title;String content;}

然后在我们的起始页面来操作

package com.example.listviewtest03;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;import java.util.Vector;public class MainActivity extends AppCompatActivity {private ListView listView;//首先实例化布局并在下面绑定布局private Vector<News> news = new Vector<>();//新建一个泛型为News的Vector集合(Vector集合是线程安全的,是同步访问的),然后实例化。private MyAdapter myAdapter;//在开头声明然后在下面初始界面实例化@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = findViewById(R.id.listView1);initDate();//因为该方法非static在程序启动界面调用一下该方法,才能初始化数据myAdapter = new MyAdapter();listView.setAdapter(myAdapter);//实例化adapter并填入listview}/*** 初始化数据,每一次循环新建一个news对象并给两个属性赋值,然后把对象填进集合,最后index+1*/private int index = 1;private void initDate(){for (int i = 0; i<25; i++){News n = new News();n.content = "客户编号--" + index;n.title = "客户名称--" + index;news.add(n);index++;}}/*** 自定义适配器*/class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return news.size();}@Overridepublic Object getItem(int i) {return news.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if (view == null){view = getLayoutInflater().inflate(R.layout.item ,null);viewHolder = new ViewHolder();viewHolder.tv_content = view.findViewById(R.id.textView2);viewHolder.tv_title = view.findViewById(R.id.textView);view.setTag(viewHolder);}else {viewHolder = (ViewHolder) view.getTag();}News news1 = news.get(i);viewHolder.tv_title.setText(news1.title);viewHolder.tv_content.setText(news1.content);return view;}class ViewHolder{TextView tv_title;TextView tv_content;}}
}

效果是这样的

接下来就是做分页加载,当我们的数据达到我们这定好的数据就会停止加载,当用户把进度条拉到我们设定的数量的最大值之后,就会开始重新加载下一页

首先我们需要做一个加载的页面

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><ProgressBarandroid:id="@+id/progressBar2"style="?android:attr/progressBarStyle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="110dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent" /><TextViewandroid:id="@+id/textView3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:text="加载中...."app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/progressBar2" />
</androidx.constraintlayout.widget.ConstraintLayout>

这里我们用了一个progressbar(当然你也可以用别的)和一个textview来显示,progressbar实际上是动态的,实际运行效果时是转动的

然后在起始页面的onCreate方法中放进listview

package com.example.listviewtest03;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;import java.util.Vector;public class MainActivity extends AppCompatActivity {private ListView listView;//首先实例化布局并在下面绑定布局private Vector<News> news = new Vector<>();//新建一个泛型为News的Vector集合(Vector集合是线程安全的,是同步访问的),然后实例化。private MyAdapter myAdapter;//在开头声明然后在下面初始界面实例化@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = findViewById(R.id.listView1);View footview = getLayoutInflater().inflate(R.layout.loding,null);//先使用inflate实例化然后使用下面的方法填入listView.addFooterView(footview);//使该页面加载在底部,相反的加载在顶部的是 listView.addHeaderView();initDate();//因为该方法非static在程序启动界面调用一下该方法,才能初始化数据myAdapter = new MyAdapter();listView.setAdapter(myAdapter);//实例化adapter并填入listview}/*** 初始化数据,每一次循环新建一个news对象并给两个属性赋值,然后把对象填进集合,最后index+1*/private int index = 1;private void initDate(){for (int i = 0; i<25; i++){News n = new News();n.content = "客户编号--" + index;n.title = "客户名称--" + index;news.add(n);index++;}}/*** 自定义适配器*/class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return news.size();}@Overridepublic Object getItem(int i) {return news.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if (view == null){view = getLayoutInflater().inflate(R.layout.item ,null);viewHolder = new ViewHolder();viewHolder.tv_content = view.findViewById(R.id.textView2);viewHolder.tv_title = view.findViewById(R.id.textView);view.setTag(viewHolder);}else {viewHolder = (ViewHolder) view.getTag();}News news1 = news.get(i);viewHolder.tv_title.setText(news1.title);viewHolder.tv_content.setText(news1.content);return view;}class ViewHolder{TextView tv_title;TextView tv_content;}}
}

当然,我们想让他在加载页面的时候再显示,最重要的当然是写逻辑 ,我们这里使用继承

AbsListView.OnScrollListener接口的方法得到监听下拉滚动条的方法,同时判断是否最后一条信息已经显示,是的话就启动我们加载新数据的线程,加载完数据之后需要主页面进行刷新,因为子线程无法对主线程进行操作,这里我们使用了handler来向主线程发送请求,在主线程的handler里面判断,然后用notifyDataSetChanged();来进行操作,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView。下面是完整代码
package com.example.listviewtest03;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;import java.util.Vector;public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener {private ListView listView;//首先实例化布局并在下面绑定布局private Vector<News> news = new Vector<>();//新建一个泛型为News的Vector集合(Vector集合是线程安全的,是同步访问的),然后实例化。private MyAdapter myAdapter;//在开头声明然后在下面初始界面实例化private static final int DATA_UPDATE = 0x1;//数据更新完成后的标记@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = findViewById(R.id.listView1);listView.setOnScrollListener(this);//注册监听View footview = getLayoutInflater().inflate(R.layout.loding,null);listView.addFooterView(footview);//使该页面加载在底部,相反的加载在顶部的是 listView.addHeaderView();initDate();//因为该方法非static在程序启动界面调用一下该方法,才能初始化数据myAdapter = new MyAdapter();listView.setAdapter(myAdapter);//实例化adapter并填入listview}/*** 初始化数据,每一次循环新建一个news对象并给两个属性赋值,然后把对象填进集合,最后index+1*/private int index = 1;private void initDate(){for (int i = 0; i<25; i++){News n = new News();n.content = "客户编号--" + index;n.title = "客户名称--" + index;news.add(n);index++;}}/***接受子线程发送的标记从而改变主线程*/private Handler handler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {switch (msg.what ){case DATA_UPDATE:myAdapter.notifyDataSetChanged();//notifyDataSetChanged()可以在修改适配器绑定的数组后,// 不用重新刷新Activity,通知Activity更新ListView。break;}}};/*** 监听滚动条状态改变的方法* @param absListView* @param i 当前状态*  三种状态   SCROLL_STATE_FLING,这个参数表示你手离开后ListView还在“飞”中*              SCROLL_STATE_IDLE,这个参数表示ListView停下不动了*              SCROLL_STATE_TOUCH_SCROLL,这个参数表示你手还在ListView上*/private int visibleLastIndex;//用来可显示的最后一条数据的索引@Overridepublic void onScrollStateChanged(AbsListView absListView, int i) {if (myAdapter.getCount() == visibleLastIndex && i == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){new loding().start();//当最后一条数据的索引被显示,同时滚动条滚到最后停住了,启动加载新条目}}/**** @param absListView* @param i 当前第一个可见的item* @param i1 当前总共有多少个可见的item* @param i2  总的item*/@Overridepublic void onScroll(AbsListView absListView, int i, int i1, int i2) {visibleLastIndex = i + i1 -1;//注意这里不要忘了-1,因为我们做的加载的布局也占用了一个item//如果没有-1他会一直以为是在倒数第二条}/*** 该方法用于当加载新的条目的时候人为的使程序停滞1秒用来模仿网络加载时的延迟*/class loding extends Thread{@Overridepublic void run() {initDate();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}handler.sendEmptyMessage(DATA_UPDATE);//通过handler给主线程发送一个信息标记}}/*** 自定义适配器*/class MyAdapter extends BaseAdapter{@Overridepublic int getCount() {return news.size();}@Overridepublic Object getItem(int i) {return news.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if (view == null){view = getLayoutInflater().inflate(R.layout.item ,null);viewHolder = new ViewHolder();viewHolder.tv_content = view.findViewById(R.id.textView2);viewHolder.tv_title = view.findViewById(R.id.textView);view.setTag(viewHolder);}else {viewHolder = (ViewHolder) view.getTag();}News news1 = news.get(i);viewHolder.tv_title.setText(news1.title);viewHolder.tv_content.setText(news1.content);return view;}class ViewHolder{TextView tv_title;TextView tv_content;}}
}

ListView第四节 刷新分页相关推荐

  1. android--(布局ListView、优化、刷新分页、ArrayAdapter、SimpleAdapter 、BaseAdapter)

    ListView组件: 列表视图是Android 中最为常用的一种视图组件,它以垂直列表的方式列出 需要显示的列表项,例如:显示联系人名单.系统设置项等,都用到了ListView组件 public c ...

  2. ListView的四种优化方式

    ListView的四种优化方式 优化方式一: convertView的复用   第一种优化就是重用convertView,这也是最简单的一种优化方式,就是在Adapter类的getView方法中通过判 ...

  3. Android ListView 实现下拉刷新上拉加载

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频 ...

  4. 探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

    在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个 ...

  5. Ajax+Asp.Net无刷新分页

    1.新建解决方案,并建立四个项目BLL,DAL,Model,PagerTest,如图所示: 2.Model代码 using System; using System.Collections.Gener ...

  6. libpng 源码的使用 第四节:写 (接口)

    上一篇 libpng 源码的使用 第四节:写 (设置) 主要是一些初始化及辅助信息设置,及整体概念介绍,本篇主要是写操作的接口即用户接口介绍 高级写接口 在这一点上,有两种方法可以进行: 通过高级写接 ...

  7. 第四节 百度定位、地图SDK,和风天气获取教程

    专栏目录 第一节 自定义轮播图的制作 第二节 底部导航栏菜单,炫酷菜单动画,背景变暗.按钮焦点获取 第三节 适配Android10的拍照.从相册获取代码,包括完整的权限申请和图片地址获取 第四节 百度 ...

  8. 第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析-namenode启动过程分析...

    第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode分析 4.1 namenode启动过程分析 org.apache.hadoop.hdfs.server.namenode. ...

  9. JavaWeb开发之Ajax省市联动无刷新分页

    我们在上一节课已经和大家讲解过Ajax的使用,大家可以去看下该篇文章,今天也主要是一个拓展延伸,使用Ajax去完成无刷新省市联动和无刷新分页. 案列:使用Ajax完成无刷新分页  数据库数据 crea ...

最新文章

  1. 按照文字内容动态设置TableViewCell的高度
  2. Dvtm -- 平铺式终端
  3. VMProtect 与 ASProtect 在VC中的SDK编程
  4. Postgresql 远程连接配置
  5. [jQuery基础] jQuery事件相关案例 -- 电影排行榜、Tab选项卡
  6. Python实例练手项目源码 - 关不掉的窗口
  7. jenkins插件安装失败更改插件源
  8. Torch常用函数详解
  9. does not exist or is not a readable directory
  10. 笨拙的手指(暴力枚举)
  11. win10如何共享整个D盘
  12. html学习阶段总结2
  13. Tornado笔记——用Tornado搭建假单统计考勤系统(八)
  14. CPU玩游戏温度过高,导热硅脂有何妙招解决?
  15. 基于springboot的租车系统(包含数据库源代码、完美运行、可远程调试)
  16. linux重启websphere服务,Websphere 启动关闭命令
  17. 视频+课件|3D视觉从入门到精通系统学习教程
  18. 前端图片视频压缩工具
  19. python学习:关于生兔子问题
  20. 地籍cad的lisp程序大集合_AutoCAD-LISP程序100例

热门文章

  1. 块元素 行内元素 行内块元素各自的特点
  2. nx-shell 文件管理器_linux文件管理命令
  3. appium+python自动化测试~~~~~~~问题记录
  4. 【php】基于php+mysql 简单的登录注册修改密码系统
  5. MySQL 服务正在启动 MySQL 服务无法启动
  6. sql中TCL语句(事务控制语句)
  7. QT学习笔记:简单的串口调试助手--实现 字符与十六进制发送接收
  8. 【openmv学习笔记:1】色块查找
  9. 格莱美奖得主爱莉安娜-格兰德推出新款香水THANK U, NEXT
  10. 给QLabel设置图标