android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多
作者:ZhengJiaoCsdn 发布时间:2023-05-23 05:29:16
本文实例为大家分享了Android实现ListView下拉刷新上拉加载更多的具体代码,供大家参考,具体内容如下
其实谷歌官方目前已经推出ListView下拉刷新框架SwipeRefreshLayout,想了解的朋友可以点击 android使用SwipeRefreshLayout实现ListView下拉刷新上拉加载 了解一下;
大家不难发现当你使用SwipeRefreshLayout下拉的时候布局文件不会跟着手势往下滑,而且想要更改这个缺陷好像非常不容易。
虽然SwipeRefreshLayout非常简单易懂,但是需求需要下拉刷新的时候跟着手势下滑就不能用SwipeRefreshLayout了;
上面图片效果使用的是PullToRefresh框架,在我的工程里面没有导入类库和jar包,而是把下拉刷新功能直接抽取出来使用;
当下拉的时候回调监听,在抽取完下拉刷新功能的基础上实现上拉加载更多功能实现也非常简单,所以顺手写上了;
我是从github上下载的Android-PullToRefresh-master框架,在library中抽取的;
首先需要复制的类大概有十个左右:
然后跟进报错查看需要什么文件就复制什么文件;把错误搞定之后首先来看下布局:
<LinearLayout 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"
android:orientation="vertical">
<!-- 我们添加了一个属性:ptr:ptrMode="both" ,意思:上拉和下拉都支持。
可选值为:disabled(禁用下拉刷新),pullFromStart(仅支持下拉刷新),
pullFromEnd(仅支持上拉刷新),both(二者都支持),manualOnly(只允许手动触发) -->
<!--
ptr:ptrAnimationStyle="rotate"
FlipLoadingLayout为iOS风格的箭头颠倒的刷新动画
ptr:ptrAnimationStyle="flip"
RotateLoadingLayout为android风格的图片旋转动画 -->
<com.ptrflv.www.pulltorefreshlistview.PullToRefreshListView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/pull_to_refresh_listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ptr:ptrMode="both"
ptr:ptrAnimationStyle="flip"
/>
</LinearLayout>
值得注意的是默认情况下下拉刷新的执行动画中显示的文本是英文,这里我们需要手动修改pull_refresh_strings.xml中的内容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 上拉刷新 -->
<!-- …代表三个点 ... -->
<string name="pull_to_refresh_pull_label">向下拉刷新…</string>
<string name="pull_to_refresh_release_label">松开更新…</string>
<string name="pull_to_refresh_refreshing_label">正在加载…</string>
<!-- 下拉加载更多 -->
<string name="pull_to_refresh_from_bottom_pull_label">向下拉加载更多…</string>
<string name="pull_to_refresh_from_bottom_release_label">松开加载更多…</string>
<string name="pull_to_refresh_from_bottom_refreshing_label">正在加载…</string>
</resources>
下面是调用下拉刷新和上下加载更多的代码:
public class MainActivity extends Activity {
private PullToRefreshListView pullToRefreshListView;
//adapter的数据源
private List<String> numList=new ArrayList<String>();
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pullToRefreshListView=(PullToRefreshListView) findViewById(R.id.pull_to_refresh_listview);
//初始化数据
for(int x=0;x<18;x++){
numList.add(""+x);
}
arrayAdapter = new ArrayAdapter<String>(this, R.layout.item_listview,R.id.textview,numList);
pullToRefreshListView.setAdapter(arrayAdapter);
//设定刷新监听
pullToRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
// 显示最后更新的时间
refreshView.getLoadingLayoutProxy() .setLastUpdatedLabel(label);
//代表下拉刷新
if(refreshView.getHeaderLayout().isShown()){
new Thread(){
public void run() {
try {
sleep(1000);
handler.sendEmptyMessage(99);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}
//代表下拉刷新
if(refreshView.getFooterLayout().isShown()){
new Thread(){
public void run() {
try {
sleep(1000);
handler.sendEmptyMessage(98);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}
}
});
}
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what==99){
numList.add(0, "英雄联盟");
arrayAdapter.notifyDataSetChanged();
//关闭刷新的动画
pullToRefreshListView.onRefreshComplete();
}
if(msg.what==98){
numList.add(numList.size(), "魔兽世界");
arrayAdapter.notifyDataSetChanged();
//关闭刷新的动画
pullToRefreshListView.onRefreshComplete();
}
};
};
}
在判断上拉刷新和下拉加载的时候
refreshView.getFooterLayout().isShown()
refreshView.getHeaderLayout().isShown()会报错,因为PullToRefreshBase这两个方法默认不是共有方法,我们需要手动该更为public
源码下载
来源:http://blog.csdn.net/zheng_jiao/article/details/51425244
猜你喜欢
- 本文实例讲述了C语言二叉树常见操作。分享给大家供大家参考,具体如下:一、基本概念每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。性质
- 引言偶然在Youtube上看到一名国外安卓开发者分享了一个提升应用性能的视频,其中使用到了macro benchmark来进行性能测量,包括
- Netty设置为Https访问SSLContextFactorypublic class SSLContextFactory {
- 采用继承Thead类实现多线程:优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread(
- 本文实例讲述了Android编程之重力感应用法。分享给大家供大家参考,具体如下:重力感应主要是依靠手机的加速度传感器(acceleromet
- Android 解决TextView排版参差不齐的问题在app中,展示数据时,里面有汉字、数字、特殊字符时,由于全角、半角问题导
- 波浪球的效果一直都是想模仿的对象,在最近一段时间里模仿了这一界面,其实所用知识并不多。1)、波浪的效果是利用三角函数来实现的,在自定义vie
- 哈喽大家好啊,我是Hydra。Spring作为项目中不可缺少的底层框架,提供的最基础的功能就是bean的管理了。bean的注入相信大家都比较
- 将二维数组转化为一维数组1. 为了偷懒所以我写了一个随机生成二维数组的函数/* * 自动创建随机为100以内的二维
- Java io简介Java io系统的设计初衷,就是为了实现“文件、控制台、网络设备”这些io设置的通信。例如,对于一个文件,我们可以打开文
- WPF 使用 DrawingContext 绘制刻度条框架使用大于等于.NET40;Visual Studio 2022;项目使用 
- 一般来讲,项目更换JDK版本的情况比较少,但是有时难免会遇到。电脑安装不同版本的JDK这里不做介绍。这里记录一下修改项目JDK版本要注意的几
- 在处理模板时,可以由模板逻辑决定是否加载数据,以提高性能。在Spring Boot控制器中设置数据时,使用LazyContextVariab
- 这里使用 Maven 项目管理工具构建项目初始化项目打开 Intellij IDEA,点击 Create New Project选择 Mav
- 一、什么是CharacterEncodingFilter官方解释如下是spring内置过滤器的一种,用来指定请求或者响应的编码格式。在web
- 前言前几天恰好面试一个应届生,问了一个很简单的问题:你了解过Mybatis中有几种传参方式吗?没想到其他问题回答的很好,唯独这个问题一知半解
- 1、思维导图2、什么是MVC?MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(con
- 本文实例讲述了Android编程实现下载时主界面与详细界面一致更新的方法。分享给大家供大家参考,具体如下:1、创建监听管理类public c
- 前言C# 时间戳与 标准时间的转其实不难,但需要注意下,基准时间的问题。格林威治时间起点: 1970 年 1 月 1 日的 00:00:00
- 监听模式事件模型实现了监听模式,监听模式简单来说就是事件源经过事件的封装传给 * ,当事件源触发事件后, * 接收到事件对象可以回调事件的方