看了ListView的下拉刷新,原理是动态调整 Listview的第一行的paddingTop值,然后就能实现ListView的下拉刷新。
有下面几个ListView常用的方法
getFirstVisiblePosition() 取得界面上第一个显示的位置
getLastVisiblePosition() 取得界面上最后一个显示的位置
setSelection(int position) 设置当前选中的位置,List会自动调至该位置
sdetVerticalScrollBarEnable(true) 设置scrollbar不能往下拉
getMeasuredHeight() 达到测量的长度,要在下面的measureView调用之后再调用,不然得到的是0
getBottom() 得得到view的最下面在屏幕中的位置
getPaddingTop()
还有两个方法也不错,测量view的高度
private void measureView(View child) {
ViewGroup.LayoutParams p = child.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);
int lpHeight = p.height;
int childHeightSpec;
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,
MeasureSpec.EXACTLY);
} else {
childHeightSpec = MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED);
}
Log.d(TAG, "childWidthSpec:" + childWidthSpec + " childHeightSpec:" + childHeightSpec);
child.measure(childWidthSpec, childHeightSpec);
}
在OnTouchEvent 的Move事件中计算出当下移动的位置
private void refreshHead(MotionEvent e){
int point = e.getHistorySize();
for(int i = 0; i < point; i ++){
int historicalY = (int) e.getHistoricalY(i);
int topPadding = (int)((historicalY - mLastPositionY - mRefreshViewHeight) / 1.7);
mRefreshView.setPadding(mRefreshView.getPaddingLeft(), topPadding,
mRefreshView.getPaddingRight(), mRefreshView.getPaddingBottom());
if(getFirstVisiblePosition() == 0){
if(mRefreshView.getBottom() > 50){
mListState = PULL_READ_REFRESH;
displayRefreshView();
} else {
mListState = PULL_REFRESH;
}
}
}
}