您的位置:首页 > 移动开发 > Android开发

android之listview滑动与下拉刷新冲突 : listview未到顶部便出现下拉刷新

2016-12-27 14:04 513 查看
最近遇到个棘手问题,找了好久终于找到了先例。

问题是这个样子的,支持下拉刷新的listview有一段占据整个屏幕的headerview,

触摸在headerview的地方滑动,却牵扯出下拉刷新,而我只是想滑动而已。百思不得其解。

功夫不负有心人,后来我终于找了解决办法。

android下拉刷新和listview冲突 - listview不能下拉到头部

http://blog.csdn.net/u012246458/article/details/51606056

总结一下的话应该算是listview里header部分的滑动跟listview的下拉刷新冲突了。

在listview里添加如下代码:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

if (getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0) {//到头部了
getParent().requestDisallowInterceptTouchEvent(false);//放行触摸
} else {//没有到头部
getParent().requestDisallowInterceptTouchEvent(true);//拦截触摸
}
return super.onInterceptTouchEvent(ev);
}


此处分割线=========================

这个问题是解决了,我还沾沾自喜呢,不过偶然间碰见了另一个问题,是什么呢?

就是我这个界面还有外面一层的viewpager。就是我这个界面只是一个fragment,只是viewpager的一页。而外围的viewpager是可以左右滑动的,问题就是当前的这个页面的listview按照上边的方法搞了以后,当前页面就不能左右滑了。这个就比较尴尬了啊。做项目最讨厌的就是这个了,改一个问题牵扯到别的问题。唉。不过从另一个角度想,也只有这样才能不断进步。

然后我又去百度了,这次知道是什么问题了,好找一些。

如下:

判断Listview滑到顶部的最精准方案,解决Listview设置EmptyView与SwipeRefreshLayout冲突

http://blog.csdn.net/TellH/article/details/50662634

内容很多,博主写了他披荆斩棘的历程。有些人可能并不愿意看,只想吃别人嚼碎的喂给他吃,那好,如下就是解决办法:

这次不是在listview里写了,是在界面里写:

这样就不会引起事件分发导致的冲突了。对了,上面的那个就可以删掉了。

listview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
Log.d("Measure","listview.getListPaddingTop():"+listview.getListPaddingTop()+
" listview.getTop():"+listview.getTop()+"listview.getChildAt(0).getTop():"+listview.getChildAt(0).getTop());
if (listview.getFirstVisiblePosition() == 0 &&
listview.getChildAt(0).getTop() >= listview.getListPaddingTop()) {
refrashLayout.setEnabled(true);
Log.d("TAG", "reach top!!!");
}else refrashLayout.setEnabled(false);
}
return false;
}
});


原理

给listview设置监听器,只要listview的第一个item的顶部y坐标值等于listview的顶部y坐标值表明listview到达了顶部

搞定!!!

相当有成就感的说!!!

又一条分隔线==============================================

我还是太天真,楼上的还有个问题,我睡了一晚好觉,第二天才发现的,当我滑来滑去,滑到顶部的时候,居然滑不出来下拉刷新。得再滑一遍才行。我靠,对于追求精益求精的我一想,这怎么能行!

索性研究一番,看看哪里出了问题,解铃还需系铃人,我又去阅读了一遍楼上的博文。突然发现,他上边实验时候用的是onscroll,怎么最终版本用了onTouch。

心思缜密的我觉得是不是这个出了问题呢?不管三七二十一,先试了再说。(其实就是死马当活马医。。。)

哎嗨,搞定!!!

代码如下:

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem == 0 && view.getChildAt(0).getTop() >= view.getListPaddingTop()){
listView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
LogUtils.e("listview+TAG" + "reach top!!!");
}else {
listView.setMode(PullToRefreshBase.Mode.DISABLED);
}
}
});


换汤不换药,但是搞定了,哈哈哈。(不对,还是不要高兴太早。以免打脸,哎哟我的脸,都肿了。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息