1. 程式人生 > >android之XListview,上拉下拉出現BUG

android之XListview,上拉下拉出現BUG

第一次發,不要吐槽哈

上拉載入若螢幕資料不滿會出bug;若上拉後再去下拉也會出現bug,即資料跟著手勢移動不復原

上拉載入,資料未充滿螢幕時出現bug,解決方式:在XListView中去掉onTouchEvent()方法中default下的else

public boolean onTouchEvent(MotionEvent ev) {
if (mLastY == -1) {
mLastY = ev.getRawY();
}


switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
final float deltaY = ev.getRawY() - mLastY;
mLastY = ev.getRawY();
System.out.println("資料監測:" + getFirstVisiblePosition() + "---->"
+ getLastVisiblePosition());
if (getFirstVisiblePosition() == 0
&& (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
// the first item is showing, header has shown or pull down.
updateHeaderHeight(deltaY / OFFSET_RADIO);
invokeOnScrolling();
} else if (getLastVisiblePosition() == mTotalItemCount - 1
&& (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
// last item, already pulled up or want to pull up.
updateFooterHeight(-deltaY / OFFSET_RADIO);
}
break;
default:
mLastY = -1; // reset
if (getFirstVisiblePosition() == 0) {
// invoke refresh
if (mEnablePullRefresh
&& mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
mPullRefreshing = true;
mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
if (mListViewListener != null) {
mListViewListener.onRefresh();
}
}
resetHeaderHeight();
resetHeaderHeight();
}else if (getLastVisiblePosition() == mTotalItemCount - 1) {        //解決方式:將此處的else去掉即可
// invoke load more.
if (mEnablePullLoad
&& mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
startLoadMore();
}
resetFooterHeight();
}
break;
}
return super.onTouchEvent(ev);
}

對於如果上拉了再下拉,有時會出現bug(上拉後再下拉,資料會跟著手勢移動往下移,直到移動到螢幕底部才復原),本人把XListView研究了好久發現瞭解決方式:也是在上述程式碼操作,將程式碼更改成如下

default:
mLastY = -1; // reset
if (getFirstVisiblePosition() == 0) {
// invoke refresh
if (mEnablePullRefresh
&& mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
mPullRefreshing = true;
mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
if (mListViewListener != null) {
mListViewListener.onRefresh();
}
}
resetHeaderHeight();
}else if (getLastVisiblePosition() == mTotalItemCount - 1) { 
// invoke load more.
if (mEnablePullLoad
&& mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
startLoadMore();
}
resetFooterHeight();

resetHeaderHeight();//解決方式:如果沒這句話,導致,如果先上拉載入,再下拉,會出現bug
}
--------------------- 
作者:晨兮_夏哥 
來源:CSDN 
原文:https://blog.csdn.net/gsw333/article/details/46891371 
版權宣告:本文為博主原創文章,轉載請附上博文連結!