android之XListview,上拉下拉出现BUG
2015-07-15 12:14
549 查看
第一次发,不要吐槽哈
上拉加载若屏幕数据不满会出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
}
上拉加载若屏幕数据不满会出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
}
相关文章推荐
- Android应用开发学习—Toast使用方法大全
- Android include布局文件 使用错误
- Android 启动页面弹出效果
- 【AndroidStudio】AndroidStudio如何连接手机
- Android 快速开发框架AndroidAnnotations使用详解
- android数据库SQLiteOpenHelper
- Android使用Activity用作弹出式对话框
- Android的onTouch事件分发机制
- android之ActionBarActivity的用法
- android 录制视频(环信)
- Android ORMLite ForeignCollection关联外部集合
- Pro Android学习笔记(三)——Intent
- Android入门(53)——第八章 使用GestureDetector进行手势识别
- android Li 4000 stView ListSelector 不起作用(被覆盖)
- Android开发中support_v4包版本不同导致的Unable to instantiate activity ComponentInfo
- Android PullToRefresh (ListView GridView 上下拉刷新) 使用详解
- 如何编写更省电的Android应用
- Android Studio 使用笔记: 重命名和重构
- Android 应用在后台弹出提示相关的笔记1
- 导入Android新项目出错总结