仅在列表视图顶部刷新屏幕(Android Studio)

时间:2018-02-04 02:12:33

标签: android listview android-studio swiperefreshlayout

我有这个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中,当我向下滚动以查看列表中的其他项目时,一切都很好,但是当我向上滚动查看以前的项目时,页面只会刷新。我希望列表只在我向上滚动列表顶部时刷新。

3 个答案:

答案 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)

如果RecyclerViewListView不是SwipeRefreshLayout的直接子代,则会发生此问题。

最简单的解决方案是提供OnChildScrollUpCallback实现并适当地返回结果。在下面的Kotlin代码中,refreshLayoutSwipeRefreshLayoutrecyclerViewRecyclerView,在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也得到了回答。