1. 程式人生 > >Android ScrollView巢狀Banner於RecyclerView滑動衝突解決

Android ScrollView巢狀Banner於RecyclerView滑動衝突解決

首先是佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Test">

    <com.example.caicheng.test.FScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:fillViewport="true">

        <RelativeLayout
            android:descendantFocusability="blocksDescendants"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <com.recker.flybanner.FlyBanner
                android:id="@+id/mFlyBanner"
                android:layout_width="match_parent"
                android:layout_height="180dp"/>

            <android.support.v7.widget.RecyclerView
                android:layout_below="@+id/mFlyBanner"
                android:layout_weight="1"
                android:id="@+id/mRecyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>


        </RelativeLayout>
    </com.example.caicheng.test.FScrollView>



    </LinearLayout>

 

自定義FScrollView類
public class FScrollView extends ScrollView {
    private float mLastXIntercept = 0f;
    private float mLastYIntercept = 0f;

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean intercepted = false;
        float x = ev.getX();
        float y = ev.getY();
        int action = ev.getAction() & MotionEvent.ACTION_MASK;
        switch (action) {
            case MotionEvent.ACTION_DOWN: {
                intercepted = false;
                //初始化mActivePointerId
                super.onInterceptTouchEvent(ev);
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                //橫座標位移增量
                float deltaX = x - mLastXIntercept;
                //縱座標位移增量
                float deltaY = y - mLastYIntercept;
                if (Math.abs(deltaX) < Math.abs(deltaY)) {
                    intercepted = true;
                } else {
                    intercepted = false;
                }
                break;
            }
            case MotionEvent.ACTION_UP: {
                intercepted = false;
                break;
            }
        }
        mLastXIntercept = x;
        mLastYIntercept = y;
        return intercepted;
    }
}

 

主要程式碼

public class Test extends AppCompatActivity {

    private List<Bean> mList;
    private List<Integer> mBannerList;
    private RecyclerView mRecyclerView;
    private FlyBanner mFlyBanner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        initView();
        initData();
        initAdapter();

    }

    private void initView() {
        mList=new ArrayList<>();
        mBannerList=new ArrayList<>();
        mRecyclerView = findViewById(R.id.mRecyclerView);
        mFlyBanner = findViewById(R.id.mFlyBanner);
    }

    private void initData() {
        for(int i=0;i<=100;i++){
            mList.add(new Bean("測試"+i));
        }

        mBannerList.add(R.mipmap.ic_launcher);
        mBannerList.add(R.mipmap.ic_launcher);
        mBannerList.add(R.mipmap.ic_launcher);
        mFlyBanner.setImages(mBannerList);

    }

    private void initAdapter() {
        mRecyclerView.setHasFixedSize(true);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(this,mList);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this) {
            @Override
            public RecyclerView.LayoutParams generateDefaultLayoutParams() {
                return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
            }
        };
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setNestedScrollingEnabled(false);   //禁用自身RecyclerView滾動
        mRecyclerView.setAdapter(adapter);
    }
}