Material Design实战之下拉刷新

Material Design实战之ToolBar
Material Design实战之滑动菜单
Material Design实战之悬浮按钮和可交互提示
Material Design实战之卡片式布局
SwipeRefreshLayout就是用于实现下拉刷新的核心类,它是由support-v4库提供的。我们把想要实现下拉刷新功能的控件放置到SwipeRefreshLayout中,就可以让这个控件支持下拉刷新。那么在MaterialDemo项目中,应该支持下拉刷新功能的控件就是RecyclerView了。

由于SwipeRefreshLayout的用法也比较简单,下面我们就直接开始使用了。修改activity_main.xml中的代码,如下所示:




    
        ...
        
        
            
        
        ...

    
    ...


可以看到,这里我们在RecyclerView的外面又嵌套了一层SwipeRefreshLayout,这样RecyclerView就自动拥有下拉刷新功能了。另外需要注意,由于RecyclerView现在变成了SwipeRefreshLayout的子控件,因此之前使用app:layout_behavior声明的布局行为也要移到SwipeRefreshLayout中才行

虽然RecyclerView已经支持了下拉刷新功能了,但是我们还要在代码中处理具体的刷新逻辑才行。修改MainActivity中的代码,如下所示:

public class MainActivity extends AppCompatActivity {
    ...
   
    private SwipeRefreshLayout swipeRefreshLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...

        swipeRefreshLayout=(SwipeRefreshLayout)findViewById(R.id.swipe_refresh);
        swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary);//可以设置多种颜色
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshFruits();
            }
        });
    }
    private void refreshFruits(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        initFruits();
                        adapter.notifyDataSetChanged();
                        swipeRefreshLayout.setRefreshing(false);
                    }
                });
            }
        }).start();
    }
}

这里主要是来看一下refreshFruits()方法,它是用来进行本地刷新操作的。refreshFruits()方法先是开启了一个线程,然后将线程沉睡2秒钟。之所以这么做,是因为本地刷新操作速度非常快,如果不将线程沉睡的话,刷新立刻就结束了,从而看不到刷新的过程。沉睡结束之后,这里使用了runOnUiThread()方法将线程切换回主线程,然后调用initFruits()方法重新生成数据,接着调用FruitAdapter的notifyDataSetChanged()方法通知数据发生了变化,最后调用SwipeRefreshLayout的setRefreshing()方法并传入false,用于表示刷新事件结束,并隐藏刷新进度条。

现在重新运行一下程序,在屏幕的主界面向下拖动,会有一个下拉刷新的进度条出现,松手后就会自动进行刷新了,效果如下所示:


Material Design实战之下拉刷新_第1张图片
下拉刷新动态图.gif

这样我们就把下拉刷新的功能实现了,并且这就是Material Design中规定的最标准的下拉刷新效果。
目前我们的项目中已经应用了众多Material Design效果,Design Support库中的常用控件也学了不少了。不过在最后的一篇实战中,我们再来实现一个非常震撼的Material Design效果---可折叠式标题栏

你可能感兴趣的:(Material Design实战之下拉刷新)