阅读目录

  • 简介
  • 怎样使用SwipeRefreshLayout
  • 在ListView上使用SwipeRefreshLayout


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

SwipeRefreshLayout组件是由SDK提供,已经被用于一些Android自己的应用程序(比如Gmail)的实现。


简介

setRefrshing(true),否则取消动画就调用setRefreshing(false)

怎样使用SwipeRefreshLayout

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


Android Firebase FCM推送_应用程序

通常来说这是根组件:

         <         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只有一个子组件。现在我们来编写Activity:


         @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(true)动开启刷新画,然后生成随机数。在结束的时候(这里模拟了一个相当漫长的过程)停止动画。

在ListView上使用SwipeRefreshLayout

另一个有趣的例子是在ListView中如何使用SwipeRefreshLayout。这是一个有趣的例子,因为在真正的应用程序中,我们经常会遇到这种情况。我们有一些带ListView的项目,希望对它们刷新。如果ListView是SwipeRefreshLayout唯一的孩子,不会出现任何问题,一切都会运行正常。在某些情况下,不仅有ListView可能还有其他的元素。假设有这样一个界面:


Android Firebase FCM推送_应用程序_02

setEnabled(false)禁止使用刷新通知,当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 adp =          new          ArrayAdapter(         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         );        
                  }        
                  });        
         }



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

看到的,我们重写了ListView中的onScrollListener去处理启用/禁用机制。