dkzwm / SmoothRefreshLayout

一款支持上下拉刷新、越界回弹、二级刷新、横向刷新、拉伸回弹、平滑滚动、嵌套滚动的多功能刷新控件
MIT License
1.3k stars 218 forks source link

SmoothRefreshLayout与https://github.com/alibaba/UltraViewPager banner滑动冲突 #117

Closed jack-laowang closed 3 years ago

jack-laowang commented 4 years ago

布局如下

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/layout_root" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/bg_view"
        android:layout_width="match_parent"
        android:layout_height="194dp"
        android:background="@color/cpb_red"
        android:scaleType="fitXY" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@mipmap/bg_bhs_home_round" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:background="@mipmap/icon_bhs_home_top" />

</FrameLayout>

<RelativeLayout
    android:id="@+id/layout_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="15dp"
    android:paddingRight="15dp">

    <ImageView
        android:id="@+id/iv_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/icon_back_white"
        android:visibility="gone" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@+id/iv_back"
        android:drawablePadding="@dimen/default_padding"
        android:text="碧划算搜索领券"
        android:textColor="#ffffffff"
        android:textSize="18sp" />

    <ImageView
        android:id="@+id/iv_order"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginTop="14dp"
        android:src="@mipmap/icon_order" />

    <TextView
        android:id="@+id/tv_search"
        android:layout_width="match_parent"
        android:layout_height="38dp"
        android:layout_below="@+id/tv_title"
        android:layout_marginTop="10dp"
        android:background="@drawable/bg_bhs_search"
        android:drawableLeft="@mipmap/icon_bhs_search"
        android:drawablePadding="@dimen/default_padding"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:text="黏贴商品标题,先领券再购买"
        android:textColor="#ffaeb1c0"
        android:textSize="13sp" />

</RelativeLayout>

<me.dkzwm.widget.srl.SmoothRefreshLayout
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="@dimen/margin_10"
    android:layout_below="@+id/layout_title">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/layout_cd"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/layout_app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/transparent"
            android:elevation="0dp"
            app:elevation="0dp">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                app:layout_scrollFlags="scroll">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">

                    <com.bisinuolan.app.base.widget.traviewpager.UltraViewPager
                        android:id="@+id/banner"
                        android:layout_width="match_parent"
                        android:layout_height="140dp" />

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/rec_classify"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp"
                        android:background="@color/white" />

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@drawable/bg_bhs_shape"
                        android:orientation="vertical">

                        <android.support.v7.widget.RecyclerView
                            android:id="@+id/rec_ad"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="10dp"
                            android:layout_marginRight="10dp" />

                    </LinearLayout>

                    <LinearLayout
                        android:id="@+id/layout_super"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/act_bg_shadow"
                        android:gravity="center_vertical"
                        android:paddingLeft="10dp"
                        android:paddingTop="10dp"
                        android:paddingRight="10dp"
                        android:paddingBottom="10dp">

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="超级爆品"
                            android:textColor="#ff000000"
                            android:textSize="18sp" />

                        <TextView
                            android:id="@+id/tv_hour"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="4dp"
                            android:background="@drawable/bg_round_2_ea3644"
                            android:paddingLeft="4dp"
                            android:paddingTop="1dp"
                            android:paddingRight="4dp"
                            android:paddingBottom="1dp"
                            android:text="00"
                            android:textColor="#ffffffff"
                            android:textSize="12sp" />

                        <TextView
                            android:layout_width="4dp"
                            android:layout_height="17dp"
                            android:layout_marginLeft="4dp"
                            android:text=":"
                            android:textColor="#ffff0c36"
                            android:textSize="12sp" />

                        <TextView
                            android:id="@+id/tv_minute"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="4dp"
                            android:background="@drawable/bg_round_2_ea3644"
                            android:paddingLeft="4dp"
                            android:paddingTop="1dp"
                            android:paddingRight="4dp"
                            android:paddingBottom="1dp"
                            android:text="00"
                            android:textColor="#ffffffff"
                            android:textSize="12sp" />

                        <TextView
                            android:layout_width="4dp"
                            android:layout_height="17dp"
                            android:layout_marginLeft="4dp"
                            android:text=":"
                            android:textColor="#ffff0c36"
                            android:textSize="12sp" />

                        <TextView
                            android:id="@+id/tv_second"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="4dp"
                            android:background="@drawable/bg_round_2_ea3644"
                            android:paddingLeft="4dp"
                            android:paddingTop="1dp"
                            android:paddingRight="4dp"
                            android:paddingBottom="1dp"
                            android:text="00"
                            android:textColor="#ffffffff"
                            android:textSize="12sp" />
                        <TextView
                            android:id="@+id/tv_next_time"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textColor="#ff999999"
                            android:layout_marginLeft="6dp"
                            android:textSize="12sp"
                            />

                        <TextView
                            android:id="@+id/tv_more"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:drawableRight="@mipmap/ic_arrow_right"
                            android:drawablePadding="@dimen/default_padding"
                            android:gravity="right"
                            android:text="更多爆品"
                            android:textColor="#ff999999"
                            android:textSize="12sp" />
                    </LinearLayout>

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/rv_hot_sale"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/act_bg_shadow" />

                </LinearLayout>

            </LinearLayout>

            <com.ogaclejapan.smarttablayout.SmartTabLayout
                android:id="@+id/smartlayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/act_bg_shadow"
                android:gravity="center"
                app:stl_customTabTextLayoutId="@layout/item_bhs_home_tab"
                app:stl_customTabTextViewId="@+id/custom_text"
                app:stl_dividerThickness="0dp"
                app:stl_indicatorColor="@color/colorAccent"
                app:stl_indicatorCornerRadius="10dp"
                app:stl_indicatorInterpolation="smart"
                app:stl_indicatorThickness="0dp"
                app:stl_underlineThickness="0dp" />

        </android.support.design.widget.AppBarLayout>

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/act_bg_shadow"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <android.support.v4.view.ViewPager
                android:id="@+id/view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_margin="5dp"
                android:overScrollMode="never" />

        </FrameLayout>

    </android.support.design.widget.CoordinatorLayout>

</me.dkzwm.widget.srl.SmoothRefreshLayout>

<com.bisinuolan.app.base.widget.textview.BSNLMarqueeView2
    android:id="@+id/marqueeView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/layout_title"
    android:layout_margin="@dimen/margin_15"
    app:mvAnimDuration="1000"
    app:mvGravity="left"
    app:mvInterval="3000"
    app:mvSingleLine="true"
    app:mvTextColor="@color/white"
    app:mvTextSize="8sp" />

dkzwm commented 4 years ago

@MinchinWang 不好意思最近比较忙,由于support版本已经停止更新了所以不会再发布版本修复了,我复制了你的xml写了个demo验证。 你可以尝试复制下面代码修改, 首先开启不拦截横向滑动

mRefreshLayout.setDisableWhenAnotherDirectionMove(true);

配置后UltraViewPager的位置应该可以滑动了,此时拖动AppBarLayout部分无法触发Fling问题复制如下代码

public class SmoothRefreshLayout extends me.dkzwm.widget.srl.SmoothRefreshLayout {
    public SmoothRefreshLayout(Context context) {
        super(context);
    }

    public SmoothRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SmoothRefreshLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected boolean processDispatchTouchEvent(MotionEvent ev) {
        final int action = ev.getAction() & MotionEvent.ACTION_MASK;
        if (action == MotionEvent.ACTION_UP) {
            if (mVelocityTracker != null) {
                final int pointerId = ev.getPointerId(0);
                mVelocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
                float vy = mVelocityTracker.getYVelocity(pointerId);
                float vx = mVelocityTracker.getXVelocity(pointerId);
                if (Math.abs(vx) >= mMinimumFlingVelocity
                        || Math.abs(vy) >= mMinimumFlingVelocity) {
                    boolean handler = onFling(vx, vy, false);
                    final View targetView = getScrollTargetView();
                    if (handler
                            && !(mTargetView instanceof CoordinatorLayout)
                            && targetView != null
                            && !(targetView instanceof ViewPager)
                            && !(targetView.getParent() instanceof View
                            && targetView.getParent() instanceof ViewPager)) {
                        ev.setAction(MotionEvent.ACTION_CANCEL);
                    }
                }
                mVelocityTracker.recycle();
                mVelocityTracker = null;
            }
        }
        return super.processDispatchTouchEvent(ev);
    }
}

我看了下布局即使不用SRL,在内容ViewPager上滑动也是无法上下滑动的,还是需要升级到androidx配合ViewPager2进行实现才能完全顺滑滑动

jack-laowang commented 4 years ago

mRefreshLayout.setDisableWhenAnotherDirectionMove(true); 设置之后,会导致下面问题 1.拉到最后,上拉更多,无下一页,然后finish,返回到上个页面的刷新控件,不能下拉刷新 2,下拉刷新,然后finish当前页面, 上个页面的刷新控件不能加载更多 setDisableWhenAnotherDirectionMove这个属性导致的,去掉这个设置就不会了。所以是setDisableWhenAnotherDirectionMove(true)l

dkzwm commented 4 years ago

@MinchinWang Activity.finish()? 我有点懵逼

dkzwm commented 4 years ago

@MinchinWang 我建议你检查下代码,对象都不一样了SRL之间是不会互相影响的

jack-laowang commented 4 years ago

mRefreshLayout.setDisableWhenAnotherDirectionMove(true); 你这个属性估计是全局的吧,A页面 跳B页面,B设置setDisableWhenAnotherDirectionMove(true); 然后上拉刷新,再返回A页面,A页面就不能加载更多了。只能下拉刷新

dkzwm commented 4 years ago

@MinchinWang 对象属性,不是全局的,不存在互相干扰的情况,这一点你看源码也能明白。

jack-laowang commented 4 years ago

但确实出现了我上面说的问题 mRefreshLayout.setDisableWhenAnotherDirectionMove(true) 不设置这个属性就不会,可否看下这个方法是不是有问题?

dkzwm commented 4 years ago

你说的问题肯定和setDisableWhenAnotherDirectionMove方法无关的,至于你说不设置不会出问题,是否是因为你设置后触摸正常操作触发了其它配置导致关闭了上个界面的上拉加载,无论从源代码分析还是Demo测试setDisableWhenAnotherDirectionMove都仅仅只能影响到当前SRL对象的触摸处理逻辑。