【Android】解決ListView與SrollView、SwipeRefreshLayout滑動衝突問題

1.ListView與SrollView

我們經常需要在SrollView裏嵌套一個ListView,這會導致ListView顯示高度錯誤,不能鋪滿SrollView的空間
解決方法:新建一個類繼承ListView,重寫onMeasure方法

MyListView.java

public class MyListView extends ListView {


    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }
	//重寫此方法,改變測量的高度
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int newheightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, newheightMeasureSpec);
    }
}

2.ListView與SwipeRefreshLayout

下拉刷新也是我們常用的組件,但它也會與ListView發生衝突
解決方法:監聽listview的滑動,根據滑動位置判斷是否允許SwipeRefreshLayout起作用

以下代碼寫在onCreate()方法中

swipeRefreshLayout = findViewById(R.id.refreshLayout);
//監聽ListView的 滑動,解決與swipeRefresh的衝突問題
listView.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(listView != null && listView.getChildCount() >0){
            // 檢測第一個item是否可見
            boolean firstItemVisible = listView.getFirstVisiblePosition() == 0;
            // 檢測第一個item的頂部是否可見
            boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0;
            // 若上面兩者都可見,說明可以下拉刷新操作
            enable = firstItemVisible && topOfFirstItemVisible;
        }
        swipeRefreshLayout.setEnabled(enable);
    }
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章