问题描述:

SwipeRefreshLayout和RecyclerView配和AppBarLayout下拉刷新时的问题_ide

想用SwipeRefreshLayout和RecyclerView做下拉跟上拉刷新,这两个组件配合放在CoordinatorLayout中,CoordinatorLayout中还有一个AppBarLayout头,第一次打开的时候AppBarLayout头显示180dip的高度,从下往上拉没问题,会把AppBarLayout缩小到CollapsingToolbarLayout指定的高度,上往上拉是没问题,问题是从上往下拉,这种是拉获取最新的数据,这时候没有把缩小的AppBarLayout给再重新拉下来,反而是让SwipeRefreshLayout载到了这时候直接就成了下拉刷新了,应该是把AppBarLayout隐藏的那部分拉出来之后再响应SwipeRefreshLayout的下拉刷新,下面是xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#cccccc"
android:layout_height="match_parent" android:fitsSystemWindows="false">

<android.support.design.widget.AppBarLayout android:id="@+id/app_bar"
android:fitsSystemWindows="true" android:layout_height="180dip"
android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">

<android.support.design.widget.CollapsingToolbarLayout android:id="@+id/toolbar_layout"
android:fitsSystemWindows="true" android:layout_width="match_parent"
app:expandedTitleMarginEnd="0dp" app:expandedTitleMarginStart="48dp"
android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:contentScrim="?attr/colorPrimary">

<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
app:layout_scrollFlags="scroll|enterAlways"
android:layout_height="?attr/actionBarSize" android:layout_width="match_parent"
app:layout_collapseMode="pin" app:popupTheme="@style/AppTheme.PopupOverlay" />

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

<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@null"
android:scrollbars="vertical" />

</android.support.v4.widget.SwipeRefreshLayout>

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



问题解决:


在activity中继承接口 implements AppBarLayout.OnOffsetChangedListener,实现一个方法onOffsetChanged,完了把这个方法添加到AppBarLayout监听中就行了,代码如下:


public class MainActivity extends AppCompatActivity implements AppBarLayout.OnOffsetChangedListener {

...

@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
swipeRefreshLayout.setEnabled(i == 0);
}

@Override
protected void onResume() {
super.onResume();
app_bar.addOnOffsetChangedListener(this);
}

@Override
protected void onPause() {
super.onPause();
app_bar.removeOnOffsetChangedListener(this);
}

...

}