这几天想着界面的优化,关于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,就是刷新的时候向上滑动时,标题会跟着一块走了,没有置顶的效果。只有刷新完成时才会有我们自己想要的效果。
整体感觉还是第一种方法好点。如果你有更好的方法,不吝赐教。继续努力争取解决这个问题。
时间: 2024-10-12 04:09:49