转载请注明出处:http://blog.csdn.net/footballclub/

打造Android万能上拉下拉刷新框架–XRefreshView(一)

打造Android万能上拉下拉刷新框架–XRefreshView(二)

XRefreshView更新说明

这段时间一直有朋友给我反馈,让我帮忙解决这个问题,我汇总了下,有以下几种:

1. 处理listview滑动删除与XRefreshView的冲突

2. 处理viewpager和XRefreshView的冲突

3. listview滑动究竟部自己主动载入很多其它

4. 刷新时,不让里面的listview上下滑动

5. 自己定义headerview和footerview

6. 配置自己定义头部广告位

除了广告位的都已经完毕了。除此之外,我还对默认的header和footer做了ui上的优化,特别地,鉴于Recylerview的强大,我还针对Recylerview做了特别的适配,接下来先看效果图。在模拟器上录的。有点卡卡的。

效果图

更新具体

1.处理横向移动与XRefreshView的冲突

假设须要在手指横向移动的时候。让XRefreshView不拦截事件,

xRefreshView.setMoveForHorizontal(true);

能够调用setMoveForHorizontal并传入true就可以。

2.滑动究竟部自己主动载入很多其它

眼下仅仅做了Abslistview和Recylerview的

xRefreshView.setAutoLoadMore(false);

true会自己主动载入很多其它,false则相反。传入false的话。假设是listview。须要上拉才干载入很多其它。假设是Recylerview。则会须要点击才干载入很多其它。就像这样



点击载入很多其它涉及到自己定义footerview。到后面再说,这里先放着。

3.刷新时,不让里面的列表上下滑动

假设刷新时不想让里面的列表滑动。能够这么设置

xRefreshView.setPinnedContent(true);

4.支持button点击開始刷新

XRefreshView不仅支持手势下拉刷新,也支持button点击開始刷新。

xRefreshView.startRefresh();

能够在activity的onResume()中调用。也能够在button的点击事件中调用。

5.设置Abslistview和Recylerview的滚动监听事件

假设你有设置Abslistview和Recylerview滚动监听事件的须要的话,就不能直接使用Abslistview和Recylerview的setOnScrollListener方法了。由于为了实现自己主动载入很多其它的功能。监听已经被XRefreshView使用了,所以这时候须要使用XRefreshView提供的设置滚动监听的方法

    /**
* 设置Abslistview的滚动监听事件
*
* @param listener
*/
public void setOnAbsListViewScrollListener(OnScrollListener scrollListener) {
mContentView.setOnAbsListViewScrollListener(scrollListener);
} /**
* 设置Recylerview的滚动监听事件
*/
public void setOnRecyclerViewScrollListener(
RecyclerView.OnScrollListener scrollListener) {
mContentView.setOnRecyclerViewScrollListener(scrollListener);
}

6.设置载入很多其它

假设希望在载入很多其它数据的时候。能在没有新数据的时候。隐藏footerview的话,

new Handler().postDelayed(new Runnable() {
public void run() {
//模拟数据载入完毕
if (mLoadCount >= 3) {
xRefreshView.setLoadComplete(true);
}
adapter.insert(new Person("More ", "21"),
adapter.getAdapterItemCount());
adapter.insert(new Person("More ", "21"),
adapter.getAdapterItemCount());
adapter.insert(new Person("More ", "21"),
adapter.getAdapterItemCount());
mLoadCount++;
//刷新完毕必须调用此方法停止载入
xRefreshView.stopLoadMore();
}
}, 1000);

当调用xRefreshView.setLoadComplete(true)以后,就会隐藏footerview;假设过段时间又有新的数据了。能够调用xRefreshView.setLoadComplete(false)。这样就又能够正常载入很多其它了。

7.其它一些属性的设置

/**
* 设置headerview回滚的时间,默认400毫秒
*
* @param during
*/
public void setScrollDuring(int during) {
SCROLL_DURATION = during;
} /**
* 设置阻尼系数,建议使用默认的
*
* @param ratio
* 默认 1.8
*/
public void setDampingRatio(float ratio) {
OFFSET_RADIO = ratio;
} /**
* 设置当下拉刷新完毕以后。headerview和footerview被固定的时间
* 注:考虑到ui效果,仅仅有时间大于1s的时候,footerview被固定的效果才会生效
*
* @param pinnedTime
*/
public void setPinnedTime(int pinnedTime) {
mPinnedTime = pinnedTime;
mContentView.setPinnedTime(pinnedTime);
}

8.XRefreshView提供的监听


public interface XRefreshViewListener {
/**
* 下拉刷新的回调
*/
public void onRefresh();
/**
* 上拉载入很多其它的回调
*/
public void onLoadMore(); /**
* 用户手指释放的监听回调
*
* @param direction
* >0: 下拉释放。<0:上拉释放 注:临时没有使用这种方法
*/
public void onRelease(float direction); /**
* 获取headerview显示的高度与headerview高度的比例
*
* @param offset
* 移动距离和headerview高度的比例。范围是0~1,0:headerview全然没显示
* 1:headerview全然显示
* @param offsetY
* headerview移动的距离
*/
public void onHeaderMove(double offset, int offsetY);
}

9.自己定义header和footer

9.1.自己定义header

实现IHeaderCallBack接口。并继承View就能够自己定义headerview了

/**
* 提供自己定义headerview的接口
*
* @author huxq17@163.com
*
*/
public interface IHeaderCallBack {
/**
* 正常状态
*/
public void onStateNormal(); /**
* 准备刷新
*/
public void onStateReady(); /**
* 正在刷新
*/
public void onStateRefreshing(); /**
* 刷新结束
*/
public void onStateEnd(); /**
* 获取headerview显示的高度与headerview高度的比例
*
* @param offset
* 移动距离和headerview高度的比例,范围是0~1,0:headerview全然没显示 1:headerview全然显示
* @param offsetY
* headerview移动的距离
*/
public void onHeaderMove(double offset, int offsetY); /**
* 设置显示上一次刷新的时间
*
* @param lastRefreshTime
* 上一次刷新的时间
*/
public void setRefreshTime(long lastRefreshTime); /**
* 隐藏footerview
*/
public void hide(); /**
* 显示footerview
*/
public void show(); /**
* 获得headerview的高度,假设不想headerview所有被隐藏,就能够仅仅返回一部分的高度
*
* @return
*/
public int getHeaderHeight();
}

这里须要介绍下几种headerview的状态

Created with Raphaël 2.1.0normalnormalreadyreadyrefreshingrefreshingfinishfinishheader移动的距离大于header的高度header移动的距离小于header的高度松手进入refreshing状态刷新完毕进入finish状态,此过程header被固定着此时header開始回弹,至全然隐藏时,状态变成normal

XRefreshView提供了不同状态的回调,方便开发人员依据状态来改变headerview的显示,同一时候为了提供更加强大的支持。XRefreshView提供了onHeaderMove(double offset, int offsetY)回调来返回当前headerview移动的信息。这样能够更加自由的定制headerview。在继承了View并实现了IHeaderCallBack接口以后,须要调用以下这种方法来设置自己定义headerview

refreshView.setCustomHeaderView(new CustomHeader(this));

9.2.自己定义footer

自己定义footer和自己定义header相似,都相同要实现接口,自己定义footer要实现 IFooterCallBack接口

public interface IFooterCallBack {
/**
* 当不是到达底部自己主动载入很多其它的时候,须要自己写点击事件
* @param xRefreshViewListener
*/
public void callWhenNotAutoLoadMore(XRefreshViewListener xRefreshViewListener);
/**
* 正常状态,比如须要点击footerview才干载入很多其它。主要是到达底部不自己主动载入很多其它时会被调用
*/
public void onStateReady();
/**
* 正在刷新
*/
public void onStateRefreshing();
/**
* 刷新结束
*/
public void onStateFinish();
/**
* 已无很多其它数据
*/
public void onStateComplete();
/**
* 隐藏footerview
*/
public void hide();
/**
* 显示footerview
*/
public void show();
/**
* 获得footerview的高度
* @return
*/
public int getFooterHeight();
}

footerview的状态流程分成两种

1.当到达底部自己主动载入很多其它:

1.1.还有很多其它数据

refreshing–>finish–>refreshing

1.2.已无很多其它数据

refreshing–>finish–>complete

2.当到达底部不自己主动载入很多其它:

2.1.还有很多其它数据

ready–>refreshing–>finish–>refreshing

2.2.已无很多其它数据

ready–>refreshing–>finish–>complete

当中,当不是到达底部自己主动载入很多其它的时候,须要自己写点击事件,就像这样:

@Override
public void callWhenNotAutoLoadMore(final XRefreshViewListener listener) {
mClickView.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
if(listener!=null){
listener.onLoadMore();
onStateRefreshing();
}
}
});
}

给footer设置点击事件。在点击事件中直接回调onLoadMore。而且进入刷新状态。

还有就是footer的show和hide方法不能向header那样:

header
/**
* hide footer when disable pull load more
*/
public void hide() {
setVisibility(View.GONE);
} public void show() {
setVisibility(View.VISIBLE);
}

直接gone会给列表底部留下空白。所以应该这样

public void hide() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView
.getLayoutParams();
lp.height = 0;
mContentView.setLayoutParams(lp);
} public void show() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView
.getLayoutParams();
lp.height = LayoutParams.WRAP_CONTENT;
mContentView.setLayoutParams(lp);
}

最后也须要通过以下这种方法来设置自己定义footerview

refreshView.setCustomFooterView(new CustomFooterView(this));

10.Recylerview的Adapter

Recylerview的adapter必须继承自UltimateViewAdapter。具体使用方法能够參照demo中的SimpleAdapter,此外,给Recylerview设置自己定义footerview和设置自己定义headerview是不一样的。设置自己定义headerview是通过XRefreshView来设置的,可是设置自己定义footerview确是通过UltimateViewAdapter来设置的。具体例如以下:

UltimateViewAdapter
/**
* Using a custom LoadMoreView
*
* @param customview
* the inflated view
*/
public void setCustomLoadMoreView(View footerView) {
if (footerView instanceof IFooterCallBack) {
customLoadMoreView = footerView;
} else {
throw new RuntimeException(
"footerView must be implementes IFooterCallBack!");
}
} ...... adapter.setCustomLoadMoreView(footerView);

注:眼下上拉载入很多其它仅仅支持Linearlayoutmanager。我还在找解决的方法。

最后

XRefreshView托管于github。点此前往下载,欢迎start or fork。

參考的项目

在开发过程中有參考一些非常不错的开源项目。各自是

  1. UltimateRecyclerView
  2. android-Ultra-Pull-To-Refresh

打造Android万能上拉下拉刷新框架--XRefreshView(三)的更多相关文章

  1. 打造android万能上拉下拉刷新框架——XRefreshView (二)

    打造Android万能上拉下拉刷新框架--XRefreshView(一) 打造Android万能上拉下拉刷新框架--XRefreshView(三) 一.前言 自从上次发表了打造android万能上拉下 ...

  2. 【PullToRefresh 系列基本用法】 Android装上拉下拉刷新控制具体的解释

    转载请注明:http://blog.csdn.net/duguang77/article/details/40921601 作者信息: Chris Banes大神详情:https://github.c ...

  3. 练习使用XRecyclerView,可上拉下拉刷新。

    package com.lixu.testxrecyclerview; import android.support.v7.app.AppCompatActivity; import android. ...

  4. iOS不得姐项目--推荐关注模块(一个控制器控制两个tableView),数据重复请求的问题,分页数据的加载,上拉下拉刷新(MJRefresh)

    一.推荐关注模块(一个控制器控制两个tableView) -- 数据的显示 刚开始加载数据值得注意的有以下几点 导航控制器会自动调整scrollView的contentInset,最好是取消系统的设置 ...

  5. 解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题

    博客已迁移至http://zlwis.me. 使用过iscroll.js的上拉下拉刷新效果的朋友应该都碰到过这个问题:在iOS的浏览器中,上拉或下拉刷新时,当手指划出屏幕后,页面无法弹回.很多人因为解 ...

  6. swift实现UItableview上拉下拉刷新模块

    最近用写个项目 发现上拉下拉刷新模块没找到合适的 so 自己写了一个 由于最近忙 教程就不写了 里面有 直接贴地址https://github.com/DaChengTechnology/DCRefr ...

  7. ListView实现上拉下拉刷新加载功能

    第一步.首先在你项目中创建一个包存放支持下拉刷新和上拉加载的类:

  8. Android-PullToRefresh上拉下拉刷新加载更多,以及gridview刷新功能的Library下载地址

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 首先大家应该都听说过此开源框架的强大之处,支持单列以及双列的 上拉加载以及下拉刷新功 ...

  9. iOS 上拉下拉刷新简单实现代码

    一般说到上拉刷新下拉刷新,很多人可能想到的是一个第三方开源框架EGORefresh,下面说下,如何自己写代码实现. UITableView本身是一个UIScrollView,所以UITableView ...

随机推荐

  1. Delphi栈对象

    来自:http://blog.csdn.net/iseekcode/article/details/5158985 ------------------------------------------ ...

  2. 为什么32位系统最大支持4G内存??我自己悟出来了 终于 。。。。。

    今天突然开窍了,想通了..... 以下是我的抽象想法: 32位系统 这个 多少位 指的是 硬件的 一次性发送过来的位数,一个字节 等于8位,内存的一个存储单元就是一个字节,即8位. 也可以这样来想这个 ...

  3. mysql故障(主从复制sql线程不运行)

    故障现象: 进入slave服务器,运行: mysql> show slave status\G ....... Relay_Log_File: localhost Relay_Log_Pos: ...

  4. Delphi实现截屏存盘的方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. Android studio配置使debug签名和release签名一致

    在module的build.gradle中添加 android { //重要部分 signingConfigs { release { keyAlias 'jxt' keyPassword '1234 ...

  6. easyui常用

    清空列表选中项 //easyui datagrid 清空勾选 $('#List').datagrid('clearSelections'); 扩展修改查询方法 function QueryList() ...

  7. java有自动垃圾回收机制

    当垃圾收集器判断已经没有任何引用指向对象的时候,会调用对象的finalize方法来释放对象占据的内存空间~ java中垃圾回收以前听老师讲好像是内存满了他才去做一次整体垃圾回收,在回收垃圾的同时会调用 ...

  8. JD2

    Business Requirement Support l Develops and communicates plan to manage vendor review of requirement ...

  9. 访问控制技术- 扩展IP访问列表

    1.设置pc IP 网关 192.168.1.1 192.168.1.254 192.168.1.2 192.169.1.254 192.168.3.1 192.168.3.254 192.168.3 ...

  10. 鼠标悬浮tip 显示

    鼠标悬浮tip 显示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...