当要显示的数据过多时,为了更好的提升用户感知,在很多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文件:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.day08.MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
</RelativeLayout>

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

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="Tile"
android:textSize="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView" />
<TextView
android:text="Message"
android:textSize="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView2" />
</LinearLayout>

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

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent" android:gravity="center">
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/progressBar" />
<TextView
android:text="玩命加载中"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView3" />
</LinearLayout>

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

 public class News {
String title;
String message;
}

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

 import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by panchengjia on 2016/11/29.
*/
public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener{
private ListView lv;
private List<News> news;//声明存储新闻标题与内容的List
private int total=1;//计数器(设置默认从1开始)用于集合内数据初始化
MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv= (ListView) findViewById(R.id.lv);
//为当前ListView设置OnScrollListener实现分页刷新
lv.setOnScrollListener(this);
//将login_item(下拉刷新效果的item)通过布局 填充器声明
View v = getLayoutInflater().inflate(R.layout.login_item,null);
//将login_item设置到ListView页脚
lv.addFooterView(v);
//实例化存储内容资源的List
news = new ArrayList<>();
//调用初始化List的方法
initList();
adapter = new MyAdapter();
//设置单击item的事件
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
show(view);//事件处理为调用show方法(显示AlertDialog对话框)
}
});
lv.setAdapter(adapter);
}
//AlertDialog对话框的调用这里就不多说了,前期有专门的博文解释
public void show(View v){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
TextView title = (TextView) v.findViewById(R.id.textView);
TextView message = (TextView) v.findViewById(R.id.textView2);
builder.setTitle(title.getText().toString());
builder.setMessage(message.getText().toString());
builder.setPositiveButton("已经浏览完毕", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
});
builder.show();
}
//初始化List内的元素,模拟每次可刷新10条信息
private void initList() {
for(int i=1;i<=10;i++){
News n = new News();
//加total是因为total在刷新页面后不会继续从一开始
n.title = "Title--"+total;
n.message="Message"+total;
news.add(n);
total++;
}
}
// int currenVisibleItemCount;//声明截止当前页面看到的item总数(演示用)
boolean isLastRow=false;//判断是否到ListView的最后一个item
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//firstVisibleItem位可见页面的第一条在Arraylist中的下标,visibleItemCount为当前页面item数
// currenVisibleItemCount = firstVisibleItem+visibleItemCount-1=totalItemCount;(演示用)
if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){
isLastRow=true;//判断已经到最后一个item(即为footerView)
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
/*判断是否刷新页面之前,解释一下scrollState的三种状态
* 1.scrollState = SCROLL_STATE_TOUCH_SCROLL为手指按住屏幕滚动(未脱离屏幕);
* 2.scrollState = SCROLL_STATE_FLING可以理解为手指离开屏幕前,用力滑了一下,
* 手指离开后,页面已然保持滚动;
* 3.scrollState = SCROLL_STATE_IDLE手指未接触屏幕,且屏幕页面保持静止
* 开启刷新页面的线程前,确保ListView已经到最后一行(Item)并且屏幕页面保持静止
* */
if(isLastRow&&scrollState==SCROLL_STATE_IDLE){
new Thread(new MyThread()).start();
}
}
//创建分页刷新线程(模拟刷新)
class MyThread implements Runnable{ @Override
public void run() {
try {
Thread.sleep(500);//设置线程休眠时间为500毫秒刷新一次
} catch (InterruptedException e) {
e.printStackTrace();
}
initList();//重新初始化List
//线程内调用Handler执行页面刷新(后面会写文对handler进行详细剖析)
handler.sendEmptyMessage(1);
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
//强制调用适配器的getView来刷新每个Item的内容。
adapter.notifyDataSetChanged();
break;
}
}
};
//自定义适配器
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return news.size();
}
@Override
public Object getItem(int position) {
return news.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh;
if(convertView==null){
convertView = getLayoutInflater().inflate(R.layout.item,null);
vh=new ViewHolder();
vh.message = (TextView) convertView.findViewById(R.id.textView2);
vh.title= (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(vh);
}
vh= (ViewHolder) convertView.getTag();
vh.title.setText(news.get(position).title);
vh.message.setText(news.get(position).message);
return convertView;
}
class ViewHolder{
TextView title;
TextView message;
}
}
}

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

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

  1. Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

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

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

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

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

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

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

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

  5. android中滑动SQLite数据库分页加载

    今天用到了android中滑动SQlit数据库分页加载技术,写了个测试工程,将代码贴出来和大家交流一下: MainActivity package com.example.testscrollsqli ...

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

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

  7. Android中自定义ListView实现上拉加载更多和下拉刷新

    ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,Gi ...

  8. Android—自定义控件实现ListView下拉刷新

    这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...

  9. android中设置ListView的选中的Item的背景颜色

    ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了,要实现放开鼠标后选择项的背景还是有颜色的. 1.配置main.xml <? ...

随机推荐

  1. 用命令行工具创建 NuGet 程序包

    NuGet.exe 下载地址 本文翻译自: https://docs.nuget.org/Create/Creating-and-Publishing-a-Package https://docs.n ...

  2. .NET - 基于事件的异步模型

    注:这是大概四年前写的文章了.而且我离开.net领域也有四年多了.本来不想再发表,但是这实际上是Active Object模式在.net中的一种重要实现方法,因此我把它掏出来发布一下.如果该模型有新的 ...

  3. [Solr] (源) Solr与MongoDB集成,实时增量索引

    一. 概述 大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务. 另外一点,用Solr索引数据后,可以把数据用在不同的项目当中,直接向Solr服务发送请求,返回xml.js ...

  4. 读取xml数据装配到字典中

    public Dictionary<string, string> GetXml() { Dictionary<string, string> dic = new Dictio ...

  5. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  6. 挑子学习笔记:对数似然距离(Log-Likelihood Distance)

    转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/log-likelihood_distance.html 本文是“挑子”在学习对数似然距离过程中的笔记摘录,文 ...

  7. C#:解决WCF中服务引用 自动生成代码不全的问题。

    问题描述: 如下图:打叉的部分是引用不成功的部分 ,在web.config文件中没有自动添加其引用代码. 英文解释 在服务引用选择自己的项目的程序集就行了,如下图: 特别注意:这些程序集一定要在自己的 ...

  8. 使用OWIN作为WebAPI的宿主

    前言 好吧,也没什么好说的,就是个技术的总结,直接生成MVC的项目,感觉好重,虽然各种东西很全 ...也许我是处女座? - -, OWIN呃,这里我就不解释了,自己也是一知半解,可以参考 Open W ...

  9. 通过HTML5的Drag and Drop生成拓扑图片Base64信息

    HTML5 原生的 Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过 ...

  10. ASP.NET MVC5下载数据到Excel文件

    项目中的一个功能是将数据导入到Excel文件中,这里使用NPOI操作Excel,代码如下: public class Excel : IDataTransfer { public Stream Exp ...