这几天想着界面的优化,关于PullToRefreshListView标题栏置顶和下拉跟随的效果。这里说说我的大体思路(如果你有跟好的方法,不吝赐教。)在listview的头部添加一个虚拟的headerView(跟标题一样)并设置成INVISIBLE。然后在下拉的时候隐藏标题栏,显示headerView。
首先看一下PullToRefreshBase的源码。这里是获得PullToRefreshListView下拉的距离(value)。
protected final void setHeaderScroll(int value) {
if (null != mOnBack) {
this.value = value;
mOnBack.OnBack(value);
}
if (DEBUG) {
Log.d(LOG_TAG, "setHeaderScroll: " + value);
}
// Clamp value to with pull scroll range
final int maximumPullScroll = getMaximumPullScroll();
value = Math.min(maximumPullScroll, Math.max(-maximumPullScroll, value));
这里的距离可以通过mOnBack.OnBack(value);的回调函数得到。在Activity页面中需要实现PullToRefreshBase.OnBack的回调。
refreshListView.setOnBack(this);
@Override
public void OnBack(int scrollY) {
mScrollY = scrollY;
if (scrollY == 0) {
count++;
}
if (count == 2) {
ll_head.setVisibility(View.VISIBLE);
headerView.setVisibility(View.INVISIBLE);
count = 0;
} else {
ll_head.setVisibility(View.GONE);
headerView.setVisibility(View.VISIBLE);
}
}
在这里一次刷新,scroollY会有2次变为0的时候,分别是下拉头部加载布局出现放手时和加载完成时。还一种方法是OnBack和setOnScrollListener结合使用。这种情况就不用判断2次0了。
@Override
public void OnBack(int scrollY) {
ll_head.setVisibility(View.GONE);
headerView.setVisibility(View.VISIBLE);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (!refreshListView.isHeaderShown()) {
ll_head.setVisibility(View.VISIBLE);
headerView.setVisibility(View.INVISIBLE);
}
}
这里会有一个bug,就是刷新的时候向上滑动时,标题会跟着一块走了,没有置顶的效果。只有刷新完成时才会有我们自己想要的效果。
整体感觉还是第一种方法好点。如果你有更好的方法,不吝赐教。继续努力争取解决这个问题。