最近遇到个棘手问题,找了好久终于找到了先例。
问题是这个样子的,支持下拉刷新的listview有一段占据整个屏幕的headerview,
触摸在headerview的地方滑动,却牵扯出下拉刷新,而我只是想滑动而已。百思不得其解。
功夫不负有心人,后来我终于找了解决办法。
- android下拉刷新和listview冲突 - listview不能下拉到头部
http://blog.youkuaiyun.com/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.youkuaiyun.com/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);
}
}
});
换汤不换药,但是搞定了,哈哈哈。(不对,还是不要高兴太早。以免打脸,哎哟我的脸,都肿了。)