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

很多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;

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

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

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

onRefreshComplete():设置刷新完成

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

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

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完毕后,判断是上拉操作还是下拉刷新操作:

// 解析json
private void parseJson(String result)
{
    List<ListJson> localList = parseJsonArray(Utils.parseListJson(result, "key"));

    if(!mIsUp)
    {
        mDataList.clear();
    }
    mDataList.addAll(localList);
}

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

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

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

/**
 * *******************下拉刷新与上拉加载的监听处理************************
 */
// 刷新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;
}

/////////////////////////////////////////////////////////////////////////////////////////lvVideo.setOnScrollListener(new OnScrollListener() {

                        @Override                        public void onScrollStateChanged(AbsListView view, int scrollState) {                                                                switch (scrollState) {                                                                // 滚动之前,手还在屏幕上  记录滚动前的下标                                case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:                                        //view.getLastVisiblePosition()得到当前屏幕可见的第一个item在整个listview中的下标                                        lvIndext=view.getLastVisiblePosition();                                        break;                                                                        //滚动停止                                 case OnScrollListener.SCROLL_STATE_IDLE:                                        //记录滚动停止后 记录当前item的位置                                        int scrolled=view.getLastVisiblePosition();                                        //滚动后下标大于滚动前 向下滚动了                                        if(scrolled>lvIndext){                                                //scroll = false;                                                UIHelper.ToastMessage(VideoMain.this,"菜单收起");                                        }                                        //向上滚动了                                        else{                                                UIHelper.ToastMessage(VideoMain.this,"菜单弹出");                                                //scroll = true;                                        }                                        break;

//////////////////////////////////////////////////////////////////////////////////////////////////////
OnScrollListener 的 onScroll() 有一个 firstVisibleItem 参数(第二个参数),向下滑动会越来越大,向上滑动就会越来越小,可以在滑动的时候存储一下这个值,然后再与当前值进行判断

 另外也可以通过view.getLastVisiblePosition() 判断,这个返回的则是屏幕底部。
 
时间: 2024-12-10 07:52:03

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

Android下拉刷新库,利用viewdraghelper实现,集成了下拉刷新,底部加载更多,数据初始加载显示loading等功能

项目Github地址:https://github.com/sddyljsx/pulltorefresh Android下拉刷新库,利用viewdraghelper实现. 集成了下拉刷新,底部加载更多,以及刚进入加载数据的loadview.包括了listview与gridview的改写. 效果1: 效果2: 效果3: 效果4: 效果5: 使用说明: imageList=(ListView)findViewById(R.id.image_list); imageAdapter=new ImageA

最新Android ListView 下拉刷新 上滑加载

开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,之前大家最常用的应该是pull to refresh或它的变种版吧,google官方在最新的android.support.v4包中增加了一个新类SwipeRefreshLayout,地址 这个类的作用就是提供官方的下拉刷新,并且效果相当不错,而上拉加载更多则用我们自定义的listview,也是相当简单. 下拉刷新 简单的介绍下: 首先它是一个viewgroup,但是它只允许有一个子控件,子控件能是任何view,使用的时候,所在

Android ListView 下拉刷新 点击加载更多

最近项目中用到了ListView的下拉刷新的功能,总结了一下前辈们的代码,单独抽取出来写了一个demo作为示例. 效果图 下拉刷新: 加载更多: CustomListView.java [java] view plaincopy package com.example.uitest.view; import java.util.Date; import com.example.uitest.R; import android.content.Context; import android.uti

Android 下拉刷新上啦加载SmartRefreshLayout + RecyclerView

在弄android刷新的时候,可算是耗费了一番功夫,最后发觉有现成的控件,并且非常好用,这里记录一下. 原文是 https://blog.csdn.net/huangxin112/article/details/78781682 ,这里是看了之后,结合自己实际遇到的问题写的. 首先引入包. //下拉框 implementation 'com.android.support:recyclerview-v7:28.0.0-beta01' implementation 'com.scwang.smar

Android如何定制一个下拉刷新,上滑加载更多的容器

前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉刷新和上滑,非常考验对android布局与父子触摸机制的功底,因此参考gitHub上的一个热门的下拉刷新项目 之所以选择他是因为它一个类就完成了所有View的适配,非常的精简强力. 需求 咱对下拉刷新.上滑加载更多的控件,需求如下: 1:下拉刷新,拖动到一定距离,提示文字变成 放手刷新 2:刷新完成

Android 自定义 ListView 上下拉动&ldquo;刷新最新&rdquo;和&ldquo;加载更多&rdquo;歌曲列表

本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码太多,点击此处下载,自己调试一下. 下载 Demo 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Android OS 2.2.2 测试数据 本演示的歌曲信息,共有 20 条,包括歌手名.歌曲名.时长.缩

Android 下拉刷新上拉加载效果功能,使用开源项目android-pulltorefresh实现

应用场景: 在App开发中,对于信息的获取与演示,不可能全部将其获取与演示,为了在用户使用中,给予用户以友好.方便的用户体验,以滑动.下拉的效果动态加载数据的要求就会出现.为此,该效果功能就需要应用到所需要的展示页面中. 知识点介绍: 本文主要根据开源项目android-pulltorefresh展开介绍. android-pulltorefresh [一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.G

Android 下拉刷新上拉加载效果功能

应用场景: 在App开发中,对于信息的获取与演示,不可能全部将其获取与演示,为了在用户使用中,给予用户以友好.方便的用户体验,以滑动.下拉的效果动态加载数据的要求就会出现.为此,该效果功能就需要应用到所需要的展示页面中. 知识点介绍: 本文主要根据开源项目android-pulltorefresh展开介绍. android-pulltorefresh [一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.G

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

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉加载,而是针对下拉刷新上拉加载常用的一些应用场景就行了一些总结,包含了下拉刷新上拉加载过程中遇到的一些手势冲突问题的解决方法(只能算是抛砖引玉). 去年9月的时候,那时自己正在独立做Android项目.记得刚刚写完那个ListView列表页面(木有下拉刷新,上拉加载)