Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

加载更多,执行两次或更多,什么原因 #56

Open
hbgrape opened this issue Sep 20, 2016 · 2 comments
Open

加载更多,执行两次或更多,什么原因 #56

hbgrape opened this issue Sep 20, 2016 · 2 comments

Comments

@hbgrape
Copy link

hbgrape commented Sep 20, 2016

加载更多,执行两次或更多,什么原因

@WqyJh
Copy link

WqyJh commented Feb 17, 2017

我也碰到这个问题,原因是刷新耗时比较短,在上拉动作还没结束的时候就完成了,此时的上拉动作触发了下一次刷新.
查看 MaterialRefreshLayout.java 的代码发现, 加载更多的回调方法 onRefreshLoadMore() 是在 onInterceptTouchEvent() 里的 MotionEvent.ACTION_MOVE 分支里调用的, 因此只要还在滑动,就有可能触发加载更多.

  @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (isRefreshing) return true;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mTouchY = ev.getY();
                mCurrentY = mTouchY;
                break;
            case MotionEvent.ACTION_MOVE:
                float currentY = ev.getY();
                float dy = currentY - mTouchY;
                if (dy > 0 && !canChildScrollUp()) {
                    if (mMaterialHeaderView != null) {
                        mMaterialHeaderView.setVisibility(View.VISIBLE);
                        mMaterialHeaderView.onBegin(this);
                    } else if (mSunLayout != null) {
                        mSunLayout.setVisibility(View.VISIBLE);
                        mSunLayout.onBegin(this);
                    }
                    return true;
                } else if (dy < 0 && !canChildScrollDown() && isLoadMore) {
                    if (mMaterialFooterView != null && !isLoadMoreing) {
                        soveLoadMoreLogic();
                    }
                    return super.onInterceptTouchEvent(ev);
                }
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

解决: 将事件派发的逻辑放到 MotionEvent.ACTION_UP 分支里, 亲测可行.
本人对代码的其它逻辑不是很了解, 所以也不能确定这样不会造成其它问题, 希望作者看到可以解决一下这个问题, 谢谢啦.

 @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (isRefreshing) return true;
        float currentY = ev.getY();
        float dy = currentY - mTouchY;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mTouchY = ev.getY();
                mCurrentY = mTouchY;
                break;
            case MotionEvent.ACTION_UP:
                if (dy < 0 && !canChildScrollDown() && isLoadMore) {
                    if (mMaterialFooterView != null && !isLoadMoreing) {
                        soveLoadMoreLogic();
                    }
                    return super.onInterceptTouchEvent(ev);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (dy > 0 && !canChildScrollUp()) {
                    if (mMaterialHeaderView != null) {
                        mMaterialHeaderView.setVisibility(View.VISIBLE);
                        mMaterialHeaderView.onBegin(this);
                    } else if (mSunLayout != null) {
                        mSunLayout.setVisibility(View.VISIBLE);
                        mSunLayout.onBegin(this);
                    }
                    return true;
                }
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }

@wmailn
Copy link

wmailn commented Mar 16, 2017

我也遇到了,列表一碰就触发加载更多 :#67

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants