我有这个SwipeRefreshLayout XML代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeContainer"
xmlns:design="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:weightSum="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:theme="@style/Theme.AppCompat"
tools:context="com.tag.instagramdemo.example.MainActivity"
android:background="@drawable/background1">
<android.support.design.widget.CoordinatorLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lvRelationShip2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<EditText
android:id="@+id/txtsearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search" />
<ListView
android:id="@+id/lvRelationShip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
<TableLayout
android:id="@+id/table1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_gravity="bottom"
android:stretchColumns="0,1,2">
<TableRow
android:id="@+id/tableRowFive"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:adjustViewBounds="true"
android:maxHeight="40dp"
android:maxWidth="40dp"
android:scaleType="fitCenter"
android:src="@drawable/arrow" />
<TextView
android:layout_gravity="center_horizontal|bottom"
android:text="Click To View"
android:textSize="26dp" />
<ImageView
android:adjustViewBounds="true"
android:maxHeight="40dp"
android:maxWidth="40dp"
android:scaleType="fitCenter"
android:src="@drawable/arrow2" />
</TableRow>
<android.support.design.widget.BottomNavigationView xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_gravity="bottom"
android:animateLayoutChanges="true"
android:background="#ffffff"
android:clickable="false"
android:contextClickable="false"
android:enabled="false"
app:itemIconTint="@color/text"
app:itemTextColor="@color/text"
design:menu="@menu/menu_main" />
</TableLayout>
</android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SwipeRefreshLayout>
请注意,我的ListView具有ID:lvRelationShip。
在这个SwipeRefresh XML文件中,我希望刷新操作仅在滚动到ListView顶部时触发。
问题:在ListView中,当我向下滚动以查看列表中的其他项目时,一切都很好,但是当我向上滚动查看以前的项目时,页面只会刷新。我希望列表只在我向上滚动列表顶部时刷新。
答案 0 :(得分:0)
使ListView成为您的RefreshView的直接子项,也是第一个孩子。它认为它已经达到顶峰,因为XML的顶部还有其他元素
xmlns:design="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:weightSum="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:theme="@style/Theme.AppCompat"
tools:context="com.tag.instagramdemo.example.MainActivity"
android:background="@drawable/background1">
<ListView
android:id="@+id/lvRelationShip"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
...
我在手机上写这封信。请原谅格式错误。请注意,我从顶部删除了两个布局标记,这就是您需要布局的方式,列表是直接子元素和第一个元素。
答案 1 :(得分:0)
观察列表的滚动位置并相应地禁用SwipeRefreshLayout,这对我有用
//SwipeRefreshLayout refresh-only-when-at-the-top
mSwipeRefreshLayout.getViewTreeObserver().addOnScrollChangedListener(mOnScrollChangedListener =
new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (listView.getScrollY() == 0)
mSwipeRefreshLayout.setEnabled(true);
else
mSwipeRefreshLayout.setEnabled(false);
}
});
答案 2 :(得分:0)
如果RecyclerView
或ListView
不是SwipeRefreshLayout
的直接子代,则会发生此问题。
最简单的解决方案是提供OnChildScrollUpCallback
实现并适当地返回结果。在下面的Kotlin代码中,refreshLayout
是SwipeRefreshLayout
,recyclerView
是RecyclerView
,在xml
布局代码中也可以看到。
refreshLayout.setOnChildScrollUpCallback(object : SwipeRefreshLayout.OnChildScrollUpCallback {
override fun canChildScrollUp(parent: SwipeRefreshLayout, child: View?): Boolean {
if (recyclerView != null) {
return recyclerView.canScrollVertically(-1)
}
return false
}
})
xml
的布局是这样的,
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh".../>
...
lots of other views i.e TextView, ImageView, MotionLayout
...
...
...
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView".../>
...
...
...
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
here也得到了回答。