可折叠-上下左右都可滑动-同时具备上拉加载下拉刷新

首先,上下滑动和左右滑动很好解决,ViewPager+TabLayout+ListView就能很好的实现。

最主要的是折叠 + 加载刷新:

一.部局折叠

我们可以使用CoordinatorLayout来实现,它主要的作用是

使用:

导入依赖

implementation 'com.android.support:design:26.+'

然后在跟布局设置CoordinatorLayout

<android.support.design.widget.CoordinatorLayout 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"
    android:background="@drawable/gradient"
    tools:context=".ui.fragment.HomeFragment">


    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

            <!-设置想折叠的布局,然后添加下面的属性-!>
            <app:layout_scrollFlags="scroll|enterAlways">

            <com.androidkun.xtablayout.XTabLayout
                android:id="@+id/homeFragment_tab"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/colorFFFFFF"
                app:xTabDividerWidthWidthText="true"
                app:xTabTextSize="20sp"
                app:xTabSelectedTextSize="20sp"></com.androidkun.xtablayout.XTabLayout>

    </android.support.design.widget.AppBarLayout>
    <!-设置滑动的布局,然后添加 app:layout_behavior="@string/appbar_scrolling_view_behavior"属性-!>
    <android.support.v4.view.ViewPager
        android:id="@+id/homeFragment_vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorFFFFFF"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"></android.support.v4.view.ViewPager>

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

为了使得Toolbar有滑动效果,必须做到如下三点: 
1. CoordinatorLayout作为布局的父布局容器。 
2. 给需要折叠的组件设置 app:layout_scrollFlags=”scroll|enterAlways” 属性。 
3. 给滑动的组件设置app:layout_behavior属性

二、加载刷新,我是用的是SmartRefreshLayout,前面我的博客有。需要的可以去看看

<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/reuse_srl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/gray_f4"
    tools:context=".ui.fragment.ReuseFragment">

    <!--<ListView-->
        <!--android:id="@+id/lv_reuse"-->
        <!--android:background="@color/colorFFFFFF"-->
        <!--android:layout_marginTop="10px"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="wrap_content">-->
    <!--</ListView>-->

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <com.guorentong.learn.organ.utils.MyListView
            android:id="@+id/lv_reuse"
            android:background="@color/colorFFFFFF"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        </com.guorentong.learn.organ.utils.MyListView>
    </android.support.v4.widget.NestedScrollView>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>

这里需要注意一点的是,你使用RecyclerView没有问题。但是使用listview使用会抢占滑动,所以我们需要处理一下

由于CoordinatorLayout实现NestedScrollingParent接口,RecycleView实现了NestedScrollingChild接口,所以就可以在NestedScrollingChildHelper的帮助下实现滑动联动,知道了原因这就简单了,让我们的LIstView实现NestedScrollingChild接口

public class MyListView extends ListView implements NestedScrollingChild {

    private final NestedScrollingChildHelper mScrollingChildHelper;

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mScrollingChildHelper = new NestedScrollingChildHelper(this);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            setNestedScrollingEnabled(true);
        }
    }
    @Override
    public void setNestedScrollingEnabled(boolean enabled) {
        mScrollingChildHelper.setNestedScrollingEnabled(enabled);
    }
    @Override
    public boolean isNestedScrollingEnabled() {
        return mScrollingChildHelper.isNestedScrollingEnabled();
    }
    @Override
    public boolean startNestedScroll(int axes) {
        return mScrollingChildHelper.startNestedScroll(axes);
    }
    @Override
    public void stopNestedScroll() {
        mScrollingChildHelper.stopNestedScroll();
    }
    @Override
    public boolean hasNestedScrollingParent() {
        return mScrollingChildHelper.hasNestedScrollingParent();
    }
    @Override
    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed,
                                        int dyUnconsumed, int[] offsetInWindow) {
        return mScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed,
                dxUnconsumed, dyUnconsumed, offsetInWindow);
    }
    @Override
    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
        return mScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
    }
    @Override
    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
        return mScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
    }
    @Override
    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
        return mScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
    }
}

需要记得在xml布局文件中,在MyListView外层嵌套一层NestedScrollView即可

这样就一个 可以折叠、上下左右滑动、加载刷新的页面就大功告成!

猜你喜欢

转载自my.oschina.net/u/3698786/blog/1819861