解決ListView與SwipeRefreshLayout滑動衝突的問題
阿新 • • 發佈:2019-02-06
這個問題呢,在我初次接觸SwipeRefreshLayout的時候也遇到過,後來查了相關資料和網路資訊,得以解決,今天再次想到了這個問題,就記下來做個備忘吧。
首先說一下使用方式:SwipeRefreshLayout作為官方下拉重新整理控制元件,要將 ListView控制元件包裹在裡面,這樣才能在滑動ListView的時候監聽到滑動事件進而從頂部調出下拉重新整理控制元件
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/ly_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
然而就是因為這樣,才出現了滑動衝突問題,因為一旦啟用SwipeRefreshLayout,只要是包裹之內的容器發生下拉動作,就會觸發重新整理,那樣,ListView內容如果大於一屏,滾動到下面就無法回到頂部了,因為滾回頂部需要下拉滑動,就會首先觸發SwipeRefreshLayout的下拉事件,尷不尷尬,扎不扎心?
沒事,很好解決,直接看程式碼吧
lv.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
boolean enable = false;
if (lv != null && lv.getChildCount() > 0) {
boolean firstItemVisible = lv.getFirstVisiblePosition() == 0;
boolean topOfFirstItemVisible = lv.getChildAt(0).getTop() == 0;
enable = firstItemVisible && topOfFirstItemVisible;
}
lyRefresh.setEnabled(enable);
}
});
原理很簡單,監聽ListView的OnScrollListener事件,如果item沒有滑到最頂端,就禁用SwipeRefreshLayout,到了頂端以後再啟用,就不會產生衝突了