恒泰博远,专家级研发软件定制开发公司,为企业定制营销、办公、管理软件 在线咨询 :
咨询电话:010-82969001

Android的Swipe Refresh Layout教程

来源:http://www.hengtaiboyuan.com 作者:恒泰博远 时间:2014-06-03

[摘要]在这篇文章中,我们将介绍SwipeRefreshLayout组件。这个组件应该被使用时,用户可以使用扫动手势刷新UI。在以前的文章中,我们谈到了另一种方法来刷新,我们叫摇刷新界面,在这里用户摇摇智能手机,并使用加速度传感器的应用程序更新用户界面。我们谈到了一个自定义实现在这篇文章中,我们实施了一些像它这样的刷新模式。

在这篇文章中,我们将介绍SwipeRefreshLayout组件。这个组件应该被使用时,用户可以使用扫动手势刷新UI。在以前的文章中,我们谈到了另一种方法来刷新,我们叫摇刷新界面,在这里用户摇摇智能手机,并使用加速度传感器的应用程序更新用户界面。我们谈到了一个自定义实现在这篇文章中,我们实施了一些像它这样的刷新模式。

 

该SwipeRefreshLayout组件是由SDK提供,它已经被用于一些应用程序通过Android的(即Gmail的)提供了一个标准的实现。

 

介绍

 

该组件只接受一个孩子:我们要刷新一个。它使用一个侦听机制来通知拥有该刷新事件发生此组件的听者,所以在其他字我们的活,例如,必须实现通知的接口。该活动负责处理事件刷新和刷新相应的视图。如果监听,一旦它接收到的事件,决定了刷新过程中应采取的地方,要展示一个“刷新动画” ,它必须调用setRefrshing (真) ,否则就取消动画调用setRefreshing (假) 。

 

如何使用SwipeRefreshLayout

 

现在我们知道这是如何工作的组成部分,我们将创建一个简单的例子来说明如何使用它。让我们假设我们要为用户使用一个垂直滑动手势来产生一个随机数:

通常这个组件是根组件:

<android.support.v4.widget.SwipeRefreshLayout

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:id="@+id/swipe">

    <ScrollView

        android:layout_width="match_parent"

        android:layout_height="match_parent">

        <RelativeLayout

            android:layout_width="match_parent"

            android:layout_height="match_parent">

 

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="Random number:"

                android:id="@+id/lbl"/>

 

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:id="@+id/rndNum"

                android:layout_toRightOf="@id/lbl"/>

 

 

            <TextView

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_below="@id/lbl"

                android:layout_centerHorizontal="true"

                android:layout_marginTop="20dp"

                android:text="Swipe to Refresh"

                style="@android:style/TextAppearance.Medium"/>

 

 

 

        </RelativeLayout>

    </ScrollView>

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

 

正如您可以从上面的布局看, SwipeRefreshLayout只有一个孩子。现在,我们可以编写我们的活动:

 

...    

@Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        final SwipeRefreshLayout swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe);

        final TextView rndNum = (TextView) findViewById(R.id.rndNum);

        swipeView.setColorScheme(android.R.color.holo_blue_dark, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_green_light);

        swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

            @Override

            public void onRefresh() {

                swipeView.setRefreshing(true);

                Log.d("Swipe", "Refreshing Number");

                ( new Handler()).postDelayed(new Runnable() {

                    @Override

                    public void run() {

                        swipeView.setRefreshing(false);

                        double f = Math.random();

                        rndNum.setText(String.valueOf(f));

                    }

                }, 3000);

            }

        });

    }

....

 

正如你所看到的一切在我们的例子发生在onCreate方法。在第6行,我们得到的参考SwipeRefreshLayout这样我们就可以设置监听器(线10,11,12 ) 。在听者,我们根本就setRefreshing (真) ,使以清新的动画,然后我们生成我们的随机数。在结束(我们模拟一个相当漫长的过程) ,我们停止动画。

 

SwipeRefreshLayout用的ListView

 

另一个有趣的例子是如何使用SwipeRefreshLayout用一个ListView 。这是一个有趣的例子,因为在真正的应用程序,我们经常有这种情况,我们有一个ListView持有一些项目,我们希望刷新他们。如果ListView是唯一的一个孩子,我们不会有任何问题的SwipeRefreshLayout的,因为一切运作顺利。在某些情况下,我们不仅在ListView ,但我们还有其他的元素,让我们假设我们有一个这样的界面:

这种情况下是有点更复杂,因为如果我们向上滚动的项目在ListView一切都如预期,但如果向下滚动刷新过程开始,列表项不滚动,因为我们想要的。在这种情况下,我们可以使用一个小技巧,我们可以禁止使用setEnabled (假)的更新通知,一旦再次因为在ListView中的第一项启用它是可见的:

 

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    final SwipeRefreshLayout swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe);

 

    swipeView.setEnabled(false);

    ListView lView = (ListView) findViewById(R.id.list);

    ArrayAdapter<String> adp = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, createItems(40,0 ));

    lView.setAdapter(adp);

 

    swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

        @Override

        public void onRefresh() {

            swipeView.setRefreshing(true);

            ( new Handler()).postDelayed(new Runnable() {

                @Override

                public void run() {

                    swipeView.setRefreshing(false);

 

                }

            }, 3000);

        }

    });

 

    lView.setOnScrollListener(new AbsListView.OnScrollListener() {

        @Override

        public void onScrollStateChanged(AbsListView absListView, int i) {

 

        }

 

        @Override

        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

                if (firstVisibleItem == 0)

                    swipeView.setEnabled(true);

                else

                    swipeView.setEnabled(false);

        }

    });

}

正如你可以在33行看到,我们覆盖的ListView处理启用/禁用机制的onScrollListener 。