当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容。此过程大致分以下几步:

1.当前Activity implements OnScallListenner;

2.实现接口的方法;

3.ListView注册滚动监听;

4. Adapter(自定义或者安卓自带)为每个item填充数据;

5.获得第二页以后的数据后,adater增加数据并刷新notifyDateSetChanged();(需要用到Handler)

现在我们就通过线程休眠的的方式模拟ListView页面刷新的实现(每次加载10条信息,向下滑动会分页刷新加载)

显示效果(设置显示十条后开启刷新,添加使用AlertDialog浏览示例):

Layout中ListView布局activity_main.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:id="@+id/activity_main"
6 android:layout_width="match_parent"
7 android:layout_height="match_parent"
8 tools:context="com.example.administrator.day08.MainActivity">
9 <ListView
10 android:id="@+id/lv"
11 android:layout_width="match_parent"
12 android:layout_height="match_parent"
13 android:layout_alignParentTop="true"
14 android:layout_alignParentStart="true" />
15 </RelativeLayout>

Layout中item(填充ListView每行)布局item.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical" android:layout_width="match_parent"
4 android:layout_height="match_parent">
5 <TextView
6 android:text="Tile"
7 android:textSize="30dp"
8 android:layout_width="match_parent"
9 android:layout_height="wrap_content"
10 android:id="@+id/textView" />
11 <TextView
12 android:text="Message"
13 android:textSize="20dp"
14 android:layout_width="match_parent"
15 android:layout_height="wrap_content"
16 android:id="@+id/textView2" />
17 </LinearLayout>

Layout中页面刷新提示布局(页脚)login_item.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="horizontal" android:layout_width="match_parent"
4 android:layout_height="match_parent" android:gravity="center">
5 <ProgressBar
6 style="?android:attr/progressBarStyle"
7 android:layout_width="wrap_content"
8 android:layout_height="wrap_content"
9 android:layout_gravity="center"
10 android:id="@+id/progressBar" />
11 <TextView
12 android:text="玩命加载中"
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:id="@+id/textView3" />
16 </LinearLayout>

Java中自定义对象类(每条新闻有对应的标题以及内容)

1 public class News {
2 String title;
3 String message;
4 }

Java中功能实现类(通过实现OnScrollListener接口)

  1 import android.content.DialogInterface;
2 import android.os.Handler;
3 import android.os.Message;
4 import android.support.v7.app.AlertDialog;
5 import android.support.v7.app.AppCompatActivity;
6 import android.os.Bundle;
7 import android.view.View;
8 import android.view.ViewGroup;
9 import android.widget.AbsListView;
10 import android.widget.AdapterView;
11 import android.widget.BaseAdapter;
12 import android.widget.ListView;
13 import android.widget.TextView;
14 import java.util.ArrayList;
15 import java.util.List;
16 /**
17 * Created by panchengjia on 2016/11/29.
18 */
19 public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener{
20 private ListView lv;
21 private List<News> news;//声明存储新闻标题与内容的List
22 private int total=1;//计数器(设置默认从1开始)用于集合内数据初始化
23 MyAdapter adapter;
24 @Override
25 protected void onCreate(Bundle savedInstanceState) {
26 super.onCreate(savedInstanceState);
27 setContentView(R.layout.activity_main);
28 lv= (ListView) findViewById(R.id.lv);
29 //为当前ListView设置OnScrollListener实现分页刷新
30 lv.setOnScrollListener(this);
31 //将login_item(下拉刷新效果的item)通过布局 填充器声明
32 View v = getLayoutInflater().inflate(R.layout.login_item,null);
33 //将login_item设置到ListView页脚
34 lv.addFooterView(v);
35 //实例化存储内容资源的List
36 news = new ArrayList<>();
37 //调用初始化List的方法
38 initList();
39 adapter = new MyAdapter();
40 //设置单击item的事件
41 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
42 @Override
43 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
44 show(view);//事件处理为调用show方法(显示AlertDialog对话框)
45 }
46 });
47 lv.setAdapter(adapter);
48 }
49 //AlertDialog对话框的调用这里就不多说了,前期有专门的博文解释
50 public void show(View v){
51 AlertDialog.Builder builder = new AlertDialog.Builder(this);
52 TextView title = (TextView) v.findViewById(R.id.textView);
53 TextView message = (TextView) v.findViewById(R.id.textView2);
54 builder.setTitle(title.getText().toString());
55 builder.setMessage(message.getText().toString());
56 builder.setPositiveButton("已经浏览完毕", new DialogInterface.OnClickListener() {
57 @Override
58 public void onClick(DialogInterface dialog, int which) {
59
60 }
61 });
62 builder.show();
63 }
64 //初始化List内的元素,模拟每次可刷新10条信息
65 private void initList() {
66 for(int i=1;i<=10;i++){
67 News n = new News();
68 //加total是因为total在刷新页面后不会继续从一开始
69 n.title = "Title--"+total;
70 n.message="Message"+total;
71 news.add(n);
72 total++;
73 }
74 }
75 // int currenVisibleItemCount;//声明截止当前页面看到的item总数(演示用)
76 boolean isLastRow=false;//判断是否到ListView的最后一个item
77 @Override
78 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
79 //firstVisibleItem位可见页面的第一条在Arraylist中的下标,visibleItemCount为当前页面item数
80 // currenVisibleItemCount = firstVisibleItem+visibleItemCount-1=totalItemCount;(演示用)
81 if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){
82 isLastRow=true;//判断已经到最后一个item(即为footerView)
83 }
84 }
85 @Override
86 public void onScrollStateChanged(AbsListView view, int scrollState) {
87 /*判断是否刷新页面之前,解释一下scrollState的三种状态
88 * 1.scrollState = SCROLL_STATE_TOUCH_SCROLL为手指按住屏幕滚动(未脱离屏幕);
89 * 2.scrollState = SCROLL_STATE_FLING可以理解为手指离开屏幕前,用力滑了一下,
90 * 手指离开后,页面已然保持滚动;
91 * 3.scrollState = SCROLL_STATE_IDLE手指未接触屏幕,且屏幕页面保持静止
92 * 开启刷新页面的线程前,确保ListView已经到最后一行(Item)并且屏幕页面保持静止
93 * */
94 if(isLastRow&&scrollState==SCROLL_STATE_IDLE){
95 new Thread(new MyThread()).start();
96 }
97 }
98 //创建分页刷新线程(模拟刷新)
99 class MyThread implements Runnable{
100
101 @Override
102 public void run() {
103 try {
104 Thread.sleep(500);//设置线程休眠时间为500毫秒刷新一次
105 } catch (InterruptedException e) {
106 e.printStackTrace();
107 }
108 initList();//重新初始化List
109 //线程内调用Handler执行页面刷新(后面会写文对handler进行详细剖析)
110 handler.sendEmptyMessage(1);
111 }
112 }
113 Handler handler = new Handler(){
114 @Override
115 public void handleMessage(Message msg) {
116 super.handleMessage(msg);
117 switch (msg.what){
118 case 1:
119 //强制调用适配器的getView来刷新每个Item的内容。
120 adapter.notifyDataSetChanged();
121 break;
122 }
123 }
124 };
125 //自定义适配器
126 class MyAdapter extends BaseAdapter{
127 @Override
128 public int getCount() {
129 return news.size();
130 }
131 @Override
132 public Object getItem(int position) {
133 return news.get(position);
134 }
135 @Override
136 public long getItemId(int position) {
137 return position;
138 }
139 @Override
140 public View getView(int position, View convertView, ViewGroup parent) {
141 ViewHolder vh;
142 if(convertView==null){
143 convertView = getLayoutInflater().inflate(R.layout.item,null);
144 vh=new ViewHolder();
145 vh.message = (TextView) convertView.findViewById(R.id.textView2);
146 vh.title= (TextView) convertView.findViewById(R.id.textView);
147 convertView.setTag(vh);
148 }
149 vh= (ViewHolder) convertView.getTag();
150 vh.title.setText(news.get(position).title);
151 vh.message.setText(news.get(position).message);
152 return convertView;
153 }
154 class ViewHolder{
155 TextView title;
156 TextView message;
157 }
158 }
159 }

至此ListView的分页刷新源码已全部展示完成,个人认为实现此功能的核心为判断是否达到当前ListView中的最后一条item(包含页脚刷新提示)以及理解scrollState的状态,理解了这两点,该功能的实现起来事半功倍。

Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)的更多相关文章

  1. Android中使用ListView实现分页刷新(线程休眠模拟)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  2. ListView下拉刷新,上拉自动加载更多

    下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的Android客户端源码.先看示例图.       ...

  3. Android学习随笔--ListView的分页功能

    第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...

  4. 【转】整理一下Android中的ListView

    原文网址:http://sunbofu.blog.51cto.com/6431507/1280441 Android中的listview目测是一个使用频率很高的组件,所以今天来总结一下listview ...

  5. Android中使用ListView绘制自定义表格(2)

    上回再写了<Android中使用ListView绘制自定义表格>后,很多人留言代码不全和没有数据样例.但因为项目原因,没法把源码全部贴上来.近两天,抽空简化了一下,做了一个例子. 效果图如 ...

  6. Android打造(ListView、GridView等)通用的下拉刷新、上拉自动加载的组件

    原文 http://blog.csdn.net/bboyfeiyu/article/details/39253051       前言 下 拉刷新组件在开发中使用率是非常高的,基本上联网的APP都会采 ...

  7. Android中的ListView属性使用总结

    Android中使用ListView控件比较常见,如果能知道常用的一些属性使用,肯定会少很多坑. 1.ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景 ...

  8. Android中实现ListView圆角效果[转]

    本文演示如何Android中实现ListView圆角效果. 无论是网站,还是APP,人们都爱看一些新颖的视图效果.直角看多了,就想看看圆角,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,特 ...

  9. 使用jquery结合ajax做下拉刷新页面,上拉加载页面,俗称分页

    jquery结合iscroll.js做下拉刷新页面,上拉加载页面 先上代码,里面都有注释这就不一一说明了 <!DOCTYPE html> <html lang="en&qu ...

随机推荐

  1. Android 4.4 KitKat, the browser and the Chrome WebView

    Having V8 as the JavaScript engine for the new web view, the JavaScript performance if much better, ...

  2. 利用Linq + Jquery + Ajax 异步分页的实现

    在Web显示的时候我们经常会遇到分页显示,而网上的分页方法甚多,但都太过于消耗带宽,所以我想到了用Ajax来分页,利用返回的Json来处理返回的数据, 大大简化了带宽的压力. 先说下思路,无非就是异步 ...

  3. C#与C++之间类型的对应{转}

    Windows Data Type   .NET Data Type BOOL, BOOLEAN   Boolean or Int32 BSTR    String BYTE    Byte CHAR ...

  4. c# 与flash通信简介

    许久不曾写随笔,即使许久的怠惰,是该抬抬头,看看天了. 公司项目,项目要求是在winForm端先获取下位机的肌电信号采集数据,然后根据这些数据的变化来控制flash游戏,这样一些患者在flash游戏中 ...

  5. cf div2 237 D

    D. Minesweeper 1D time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...

  6. Services学习(一)

    对于需要长期运行,例如播放音乐.长期和服务器的连接,即使已不是屏幕当前的activity仍需要运行的情况,采用服务方式.服务将通过API触发启动或者通过IPC(Interprocess Communi ...

  7. 2013 ACM/ICPC Asia Regional Online —— Warmup

    1003 Rotation Lock Puzzle 找出每一圈中的最大值即可 代码如下: #include<iostream> #include<stdio.h> #inclu ...

  8. JDBC第二次学习

    脑子太笨,必须得记录下来一些文字,方便回来查询. 这是我的第二次学习JDBC的笔记,看的是传智播客——李勇老师的JDBC系列,已看到第23集. 分析在实际项目中该如何应用JDBC 一个简单用户相关的数 ...

  9. java 时间戳与日期字符串相互转换

    /** * 时间戳转换成日期格式字符串 * @param seconds 精确到秒的字符串 * @param formatStr * @return */ public static String t ...

  10. sshpass

    示例: ./sshpass -p ‘123456’  ssh -o StrictHostKeyChecking=no    root@192.168.1.15 ./sshpass -p ‘123456 ...