這幾天想着界面的優化,關於PullToRefreshListView標題欄置頂和下拉跟隨的效果。這裏說說個人大致思路(若是你有跟好的方法,不吝賜教。)在listview的頭部添加一個虛擬的headerView(跟標題同樣)並設置成INVISIBLE。而後在下拉的時候隱藏標題欄,顯示headerView。java
首先看一下PullToRefreshBase的源碼。這裏是得到PullToRefreshListView下拉的距離(value)。ide
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,就是刷新的時候向上滑動時,標題會跟着一塊走了,沒有置頂的效果。只有刷新完成時纔會有咱們本身想要的效果。優化
總體感受仍是第一種方法好點。若是你有更好的方法,不吝賜教。繼續努力爭取解決這個問題。
this