最近用了 开源的 AndroidPullToRefresh 库,但是发现拉动时的效果有个很奇怪的地方,无论上下拉动,当列表滚动到顶部或底部时,会瞬间弹出半个列表高度的拉动提示,感觉很不舒服,这种提示根本没必要,太丑了,而且可能会导致一些奇怪的小问题,于是查看源码搞了半天终于知道怎么回事了。
不过话说这个库还是很有名气的,但是网上真正详细介绍他的几乎没有,中文资料也难找,也许大家在这上面遇到的问题不多吧~~
下面说说我的总结:
<?xml version="1.0" encoding="utf-8"?> <com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/diaryListCt" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" android:divider="@null" android:dividerHeight="6dp" android:headerDividersEnabled="true" android:footerDividersEnabled="true" android:fadingEdge="none" android:cacheColorHint="@android:color/transparent" ptr:ptrMode="both" ptr:ptrOverScroll="true" > </com.handmark.pulltorefresh.library.PullToRefreshListView>
1. 设置上下拉两个事件:
在 XML 中
ptr:ptrMode="both"
在 Java 中
view.setMode(PullToRefreshBase.Mode.BOTH);
注册上下拉动的自定义事件
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { ZLog.i(TAG, "OnRefreshListener2 onPullUpToRefresh"); diaryList.loadNext(); } @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { ZLog.i(TAG, "OnRefreshListener2 onPullDownToRefresh"); refreshView.onRefreshComplete(); } });
这里使用的是 PullToRefreshBase.OnRefreshListener2<ListView>() 接口
若是只有一个方向则把 2 字去掉使用 PullToRefreshBase.OnRefreshListener<ListView>() 接口
一般下拉触发事件后会进行一些加载之类的动作,当你的逻辑处理完成后需要回调:onRefreshComplete(); 方法,表示当前事件已完全结束,此时拉动加载中的提示才会消失。
提示:
这里有个需要注意的地方,如果使用的是 ListView 的拉动效果则该布局产生的对象本省并不是 ListView ,而是程序内部动态生成了一个 ListView 实例,若要获取真正的 ListView 对象则需要使用一个方法来获取
ListView listView = pullTorefreshView.getRefreshableView();
2. 去除滚动到顶部或底部时弹出拉动加载更多的提示窗口
主要是我自己觉得不太好看,要解决这个问题有两个办法:不显示 | 缩短高度 或 横向时的宽度
看了半天源码之后才发现其方法的具体作用,老外的东西只看方法名很多时候搞不清楚究竟是干嘛用的,
ptr:ptrOverScroll="false"
view.setPullToRefreshOverScrollEnabled(false);
上面是通过 xml 配置 和 java 中的配置方法,当设置为 false 时就不会再弹出那个提示了
缩短提示框的方法:
在库文件 PullToRefreshBase.java 中有个常量设置
此处代码:
static final float FRICTION = 2.0f;
其中 2.0f 表示弹出框的高度为ListView 是屏幕上的可视区域高度的一半,即 screenHeight / 2,是按照一个比例来的,你可以增大这个值,设置为 5 则是 屏幕的 1/5 多一点,但不要设置太大,导致高度过低这样会影响正常的拉动时显示的提示的高度
现就这么多,以后再继续补充吧~~