很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性。查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷新和上拉加载更多。这个组件有个mode的属性,可以设置为both,即上下同时都可拉动。但是只设置这个属性的话,上拉与下拉产生的效果是完全一致的。所以要使用这个开源项目做到下拉刷新并同时可上拉加载更多,就需要在代码中进行一些处理。

==========================pulltorefresh属性相关=====================================

开源项目:Android-PullToRefresh

项目地址:https://github.com/chrisbanes/Android-PullToRefresh/wiki/Quick-Start-Guide

1.属性:https://github.com/chrisbanes/Android-PullToRefresh/blob/master/library/res/values/attrs.xml

命名空间: xmlns:ptr="http://schemas.android.com/apk/res-auto"

ptr:ptrAnimationStyle 动画效果 提供了两个值 flip和rotate 默认为rotate
ptr:ptrRefreshableViewBackground 设置刷新View的背景颜色
ptr:ptrHeaderBackground 设置头部View的背景颜色
ptr:ptrHeaderTextColor 设置头部View文字的颜色
ptr:ptrHeaderSubTextColor 设置头部view副标题文字的颜色
ptr:ptrMode

pullFromStart:

pullFromEnd:

both;

2.常用方法

setOnRefreshListener(OnRefreshListener listener):设置刷新监听器;

setOnLastItemVisibleListener(OnLastItemVisibleListener listener):设置是否到底部监听器;

setOnPullEventListener(OnPullEventListener listener);设置事件监听器;

onRefreshComplete():设置刷新完成

==========================监听listview滚动方向=====================================

修改为上拉加载更多的关键在于onrefresh方法执行之前判断出listview的滚动方向。以下方法是所尝试的方法中效果最好的一种,并不能说完美解决,但应该是效果最接近的一种了。(当首屏数据行数未充满屏幕,或者滚动时第一行的滚动距离小于行高,可能还是会存在一点误差。不过大部分应用的列表每页数据一般都能充满屏幕,也可在此基础结合其他手势判断对此方法进行改善)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int mLastFirstVisibleItem = 0;
boolean mIsScrollingUp;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
                                                                                                      
    if (view.getId() == mListView.getId())
    {
        final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();
                                                                                                          
        if (currentFirstVisibleItem > mLastFirstVisibleItem)
        {
            mIsUp = true;
        }
        else if (currentFirstVisibleItem < mLastFirstVisibleItem)
        {
            mIsUp = false;
        }
        mLastFirstVisibleItem = currentFirstVisibleItem;
    }
                                                                                                      
}

参考资料:http://stackoverflow.com/questions/12114963/detecting-the-scrolling-direction-in-the-adapter-up-down/12115157#12115157

==========================实现下拉刷新和上拉加载更多====================================

解析json完毕后,判断是上拉操作还是下拉刷新操作:

1
2
3
4
5
6
7
8
9
10
11
// 解析json
private void parseJson(String result)
{
    List<ListJson> localList = parseJsonArray(Utils.parseListJson(result, "key"));
                                                          
    if(!mIsUp)
    {
        mDataList.clear();
    }
    mDataList.addAll(localList);
}

数据加载完毕后,notifyDataSetChanged和通知PullRefreshListView,同时页码加1:

1
2
3
4
5
6
7
// 加载完毕处理
private void loadComplete()
{
    mPullRefreshListView.onRefreshComplete();
    mAdapter.notifyDataSetChanged();
    mPage += 1;
}

判断上拉和下拉方向,监听刷新listview,修改头部和底部view的文字说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
 * *******************下拉刷新与上拉加载的监听处理************************
 */
// 刷新listview监听
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView)
{
    // 获取刷新时间,设置刷新时间格式
    String str = DateUtils.formatDateTime(getActivity(), System.currentTimeMillis(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_NO_NOON);
                  
    // 判断下拉还是上拉
    if (!mIsUp)
        mPage = 0;
                  
    // 设置刷新文本说明(刷新过程中)
    if (mIsUp)
    {
        mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载");
        mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("上拉加载更多");
        mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始加载");
        refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后加载时间:" + str);
    }
    else
    {
        mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
        mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
        mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始刷新");
        refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" + str);
    }
                  
    // 启动下载任务,加载数据
    loadTask();
}
int mLastFirstVisibleItem = 0;
boolean mIsScrollingUp;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
                  
    if (view.getId() == mListView.getId())
    {
        final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();
                      
        if (currentFirstVisibleItem > mLastFirstVisibleItem)
        {
            mIsUp = true;
        }
        else if (currentFirstVisibleItem < mLastFirstVisibleItem)
        {
            mIsUp = false;
        }
        mLastFirstVisibleItem = currentFirstVisibleItem;
    }
                  
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
    // 设置刷新文本说明(展开刷新栏前)
    if (mIsUp)
    {
        mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载");
        mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("上拉加载更多");
        mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始加载");
    }
    else
    {
        mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
        mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
        mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始刷新");
    }
                  
}
@Override
public void onLastItemVisible()
{
    mIsUp = true;
}

==========================其他使用笔记====================================

1.PullRefreshListView.setRefreshing()方法无法执行更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
    protected void onRefreshing(final boolean doScroll) {
        /**
         * If we're not showing the Refreshing view, or the list is empty, the
         * the header/footer views won't show so we use the normal method.
         */
        /*ListAdapter adapter = mRefreshableView.getAdapter();
        if (!mListViewExtrasEnabled || !getShowViewWhileRefreshing() || null == adapter || adapter.isEmpty()) {
            super.onRefreshing(doScroll);
            return;
        }*/
        super.onRefreshing(false);
        }
    }

mPullRefreshListView.setRefreshing();如果adapter是里面的size是null 或者大小是0

这个时候 setRefreshing是不会有效果的.需要将PullToRefreshListView上面代码注释掉

2.通过继承OnRefreshListener2<ListView>直接实现上拉与下拉监听,但是下拉窗口的文字无法及时更新,即方法只在下拉操作后才执行。

1
2
3
4
5
6
7
8
9
        mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.refresh_listview);
        mListView = ((ListView) this.mPullRefreshListView.getRefreshableView());
         
        // 监听listview
        mPullRefreshListView.setOnRefreshListener(this);
        // mPullRefreshListView.setOnRefreshListener(this);
        // mPullRefreshListView.setOnLastItemVisibleListener(this);
        // mPullRefreshListView.setOnScrollListener(this);
         mPullRefreshListView.setOnItemClickListener(this);

相应接口方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    @Override
    public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView)
    {
        // 获取刷新时间
        String str = DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_NO_NOON);
         
        // 设置刷新文本说明(刷新过程中)
        mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
        mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
        mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始刷新");
        refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" + str);
         
        onPullDownListView();
    }
     
    public void onPullDownListView()
    {
        // TODO Auto-generated method stub
         
    }
    @Override
    public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView)
    {
        // 获取刷新时间
        String str = DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_NO_NOON);
         
        // 设置刷新文本说明(刷新过程中)
        mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载");
        mPullRefreshListView.getLoadingLayoutProxy().setPullLabel("上拉加载更多");
        mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放开始加载");
        refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后加载时间:" + str);
         
        onPullUpListView();
    }
    public void onPullUpListView()
    {
        // TODO Auto-generated method stub
         
    }

本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1312349,如需转载请自行联系原作者

Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向...相关推荐

  1. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

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

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

  3. Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这 ...

  4. android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...

    麦洛遇到这样一个需求,实现类似于IOS下拉刷新,上拉加载更多的控件.麦洛google,baidu了一番,网上有不少实现,比较常见的是国外牛人的实现,不过国外的实现基本上都是扩展于ListView,所以 ...

  5. Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这 ...

  6. Android自定义控件实战——实现仿IOS下拉刷新上拉加载 PullToRefreshLayout

    下拉刷新控件,网上有很多版本,有自定义Layout布局的,也有封装控件的,各种实现方式的都有.但是很少有人告诉你具体如何实现的,今天我们就来一步步实现自己封装的 PullToRefreshLayout ...

  7. listview下拉刷新上拉加载扩展(二)-仿美团外卖

    经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...

  8. android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多

    [1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...

  9. listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖

    本篇是基于上篇listview下拉刷新上拉加载扩展(二)-仿美团外卖改造而来,主要调整了headview的布局,并加了两个背景动画,看似高大上,其实很简单: as源码地址:http://downloa ...

最新文章

  1. R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比
  2. 一个listMap里map其中的一个字段的值相同,如何判断这个字段相同,就把这个map的其他字段存入另一个map中...
  3. html audio 本地无效源,音频文件无法播放?H5的audio标签在win7下运行时报错“无效源”?...
  4. PHP ElasticSearch的使用
  5. 钉钉宜搭3.0发布!易连接、酷数据、更安全
  6. mock 测试 MVC
  7. Unicode® Character Name Index
  8. LeetCode 1282. 用户分组(桶排序思想)
  9. Mac os区别_SN及Mac地址烧录
  10. 《计算机科学导论》 数据库基础知识
  11. ExtJS(5)- Ext5的统计图Chart
  12. opencv出错:error: (-213:The function/feature is not implemented) Unknown/unsupported array type
  13. 供应链业务架构设计概览
  14. R语言处理时间序列数据
  15. Python笔记:re模块详解
  16. MySQL中int(M)和tinyint(M)数值类型中M值的意义
  17. NovelAi + Webui + Stable-diffusion本地配置
  18. 翻译:数据页面和数据行
  19. 商圈调查方案-调研目标
  20. Mac电脑怎样自定义Safari浏览器主页?

热门文章

  1. Windows下打印utf-8文件
  2. Linux内核编译学习1
  3. 『计算机视觉』YOLO系列总结
  4. hihoCoder week17 最近公共祖先·三 lca st表
  5. sqoop/1.4.6/下载
  6. 普林斯顿大学算法课 Algorithm Part I Week 3 自我总结
  7. 如何解决弹出窗口固定大小及内容的问题
  8. python六角星绘制_一小时销量破百万,Python告诉你周杰伦的《Mojito》到底有多火!...
  9. 为什么要在神经网络分类训练中使用 Cross-Entropy?(to be continued)
  10. server sql 判断是否是当天_判断sql server 是否在开启服务状态