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);
}
});