上拉刷新下拉加载控件-PullToRefresh

  • 在很多软件中,我们会用到上拉刷新,同时大多也会有下拉加载的功能,PullToRefresh这个控件就可以帮我们实现这个效果。

  • 要使用这个空间首先我们要导包

布局文件

  • 布局文件中就是添加了一个最简单的PullToRefreshListView
<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.lingzhuo.testfrash.MainActivity">

    <com.handmark.pulltorefresh.library.PullToRefreshListView
        android:id="@+id/pullToRefreshListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></com.handmark.pulltorefresh.library.PullToRefreshListView>
</LinearLayout>

逻辑代码

public class MainActivity extends AppCompatActivity {

    private PullToRefreshListView pullToRefreshListView;
    private List<String> dataList;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        MyAdapter adapter = new MyAdapter(dataList, getApplicationContext());
        pullToRefreshListView.setAdapter(adapter);
        /**
         * * 设置PullToRefresh刷新模式
         * BOTH:上拉刷新和下拉刷新都支持
         * DISABLED:禁用上拉下拉刷新
         * PULL_FROM_START:仅支持下拉刷新(默认)
         * PULL_FROM_END:仅支持上拉刷新
         * MANUAL_REFRESH_ONLY:只允许手动触发
         */
        pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);

        pullToRefreshListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            //在这里我通过判断滑动事件中第一个可见的item来区分当前是上拉还是下拉事件,同时设置的刷新的提示的文字内容,这样设置有一定缺陷,下面我会在详细解释,至于为什么下面的监听已经实现了上拉和下拉的区分,你自己不加这个判断多拉几次就会发现问题了
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem==0){
                    //设置刷新标签
                    pullToRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
                    //设置下拉标签
                    pullToRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
                    //设置释放标签
                    pullToRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放立即刷新");
                }else{
                    //设置刷新标签
                    pullToRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载...");
                    //设置下拉标签
                    pullToRefreshListView.getLoadingLayoutProxy().setPullLabel("加载更多...");
                    //设置释放标签
                    pullToRefreshListView.getLoadingLayoutProxy().setReleaseLabel("加载更多...");
                }
            }
        });

        // 设置刷新监听
        pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                //设置上一次刷新的提示标签
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" +new SimpleDateFormat("hh:mm:ss").format(System.currentTimeMillis()));
                for (int i = 0; i < 10; i++) {
                    dataList.add("下拉加载" + i);
                }
                pullToRefreshListView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        pullToRefreshListView.onRefreshComplete();
                    }
                },1000);
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {

                //设置上一次刷新的提示标签
                refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" +new SimpleDateFormat("hh:mm:ss").format(System.currentTimeMillis()));

                pullToRefreshListView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        pullToRefreshListView.onRefreshComplete();
                    }
                },1000);
            }
        });

    }

    private void init() {
        pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView);
        dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            dataList.add("这是一条新数据" + i);
        }
    }
}
  • 当数据更新之后,必须调用这句代码 pullToRefreshListView.onRefreshComplete();
  • 但是我却是这么实现的
                pullToRefreshListView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        pullToRefreshListView.onRefreshComplete();
                    }
                },1000);
  • 因为PullToRefreshListView 实现下拉或者上拉加载时候,可能在上拉 完成时候,调用onRefreshComplete方法去停止 刷新操作,但是,可能无效,测试产生原因,刷新获取数据时候,时间太短,就会出现该问题
  • 我们可以 延迟 1秒左右,在调用onRefreshComplete 方法,可以解决该问题
        mListView.postDelayed(new Runnable() {
            @Override
            public void run() {
                mListView.onRefreshComplete();
            }
        }, 1000);
  • 记得是在 setadpter后面执行,不然 无效
  • 其实这里我们不必太在意,以为我只是写demo,真正使用这个框架的时候,我们一般都是从网上去获取数据来加载显示,一般都会有一定的延时的。
  • 我对上拉还是下拉的判断是基于当前显示第一个item是否是列表的第一个item为基准的,这就导致,当我们第一页未填满,也就是列表第一个item显示的时候,同时我们当前列表第一项就是第一个item的时候,下拉显示的提示文字,还是和上拉显示一样的文字。
  • 这里我在网上看到有人修改源码来实现区分上拉还是下拉,可能是我太菜了,不知道咋导入第三方的library,试了半天也没成功,汗!!!如果大家有兴趣的话,可以试试这个博主的改源码的方法,如果成功了记得留言教教我,谢谢。
时间: 2024-10-10 10:10:29

上拉刷新下拉加载控件-PullToRefresh的相关文章

自个儿写Android的下拉刷新/上拉加载控件 (续)

本文算是对之前的一篇博文<自个儿写Android的下拉刷新/上拉加载控件>的续章,如果有兴趣了解更多的朋友可以先看一看之前的这篇博客. 事实上之所以会有之前的那篇博文的出现,是起因于前段时间自己在写一个练手的App时很快就遇到这种需求.其实我们可以发现类似这样下拉刷新.上拉加载的功能正在变得越来越普遍,可以说如今基本上绝大多数的应用里面都会使用到.当然,随着Android的发展,已经有不少现成的可以实现这种需求的"轮子"供我们使用了. 但转过头想一下想,既然本来就是自己练手

下拉刷新上拉加载控件+Material Design使用

下拉刷新上拉加载控件+Material Design使用 人所缺乏的不是才干而是志向,不是成功的能力而是勤劳的意志. -- 部尔卫 Material Design控件使用 前几天分享了两篇Material Design控件使用的文章,这里就不多做叙述,下面是传送门,想要学习的小伙伴可以去看下: https://juejin.im/entry/58d8d4d344d90400687c134d/detail#comment https://juejin.im/entry/58d9cdf044d904

通用版的上拉刷新下拉加载控件

通用版的上拉刷新下拉加载控件 适用于各种控件实现上拉刷新,下拉加载的功能. 下载地址:http://www.devstore.cn/code/info/964.html 运行截图:    

安卓,采用最简单易懂的方式实现上拉刷新下拉加载更多

<!-- Description:上拉刷新,下拉加载更多是现在最流行的手势操作,但是对于初学者来说,在实现上是有一定难度的, 网上很多教程讲的都过于复杂,对于初学者无法起到引导作用,特此写本文,帮助安卓新手入门理解此, 还有最为重要的一点:本文只帮助你理解,并不是想你成为代码搬运工!别被那么多代码吓到了, 其中很多都是注释,仔细看注释对你理解有很大的帮助 Author:Booker L Date:2014-05-16 --> 一,事先准备: 实现该功能,最基本的需要两个东西,一个是OnTouc

Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 -- CardView.RecyclerView也是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓存. RecyclerView的优点就是,他可以通过设置LayoutMan

新浪微博项目---首页技术点三.上拉刷新,下拉加载的实现(使用ios自带的小菊花实现)

一.上拉刷新,下拉加载的实现(使用ios自带的小菊花实现) 1.下拉刷新 #pragma mark ---集成下*拉刷新控件 -(void)setupDownRefresh { //1.添加刷新控件 UIRefreshControl *control = [[UIRefreshControl alloc] init]; //只有用户通过手动下拉刷新,才会触发UIControlEventValueChanged事件 [control addTarget:self action:@selector(

Android MVP设计框架模板 之 漂亮ListView上拉刷新下拉加载更多

mvp的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理.MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller. 项目中大部分是面对接口编程,通过P层可以预先将所有需要的接口功能

jQuery手机端上拉刷新下拉加载更多页面

<!doctype html> <html> <head> <title>jquery 手机端上拉刷新下拉加载更多页面</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta name="viewpost" content="width=device-wi

PullToRefreshRecyclerView——带上拉刷新下拉加载功能的RecyclerView

PullToRefreshRecyclerView——带上拉刷新下拉加载功能的RecyclerView