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

最近遇到个棘手问题,找了好久终于找到了先例。
问题是这个样子的,支持下拉刷新的listview有一段占据整个屏幕的headerview,
触摸在headerview的地方滑动,却牵扯出下拉刷新,而我只是想滑动而已。百思不得其解。
功夫不负有心人,后来我终于找了解决办法。

总结一下的话应该算是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.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);
                }
            }
        });

换汤不换药,但是搞定了,哈哈哈。(不对,还是不要高兴太早。以免打脸,哎哟我的脸,都肿了。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值