响应刷新请求

本课介绍了如何在用户请求手动刷新(无论用户是通过滑动手势触发刷新,还是使用操作栏刷新操作触发刷新)时更新您的应用。

响应刷新手势

当用户做出滑动手势时,系统会显示进度指示器并调用应用的回调方法。您的回调方法实际上负责更新应用的数据。

要响应应用中的刷新手势,请实现 SwipeRefreshLayout.OnRefreshListener 接口及其 onRefresh() 方法。当用户做出滑动手势时,系统会调用 onRefresh() 方法。

您应将实际更新操作的代码放在单独的方法中,并通过 onRefresh() 实现调用该更新方法。这样,当用户从操作栏触发刷新时,您可以使用相同的更新方法执行更新。

更新方法会在完成数据更新后调用 setRefreshing(false)。调用此方法可指示 SwipeRefreshLayout 移除进度指示器并更新视图内容。

例如,以下代码会实现 onRefresh() 并调用 myUpdateOperation() 方法来更新 ListView 显示的数据:

Kotlin

    /*
     * Sets up a SwipeRefreshLayout.OnRefreshListener that is invoked when the user
     * performs a swipe-to-refresh gesture.
     */
    mySwipeRefreshLayout.setOnRefreshListener {
        Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout")

        // This method performs the actual data-refresh operation.
        // The method calls setRefreshing(false) when it's finished.
        myUpdateOperation()
    }
    

Java

    /*
     * Sets up a SwipeRefreshLayout.OnRefreshListener that is invoked when the user
     * performs a swipe-to-refresh gesture.
     */
    mySwipeRefreshLayout.setOnRefreshListener(
        new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout");

                // This method performs the actual data-refresh operation.
                // The method calls setRefreshing(false) when it's finished.
                myUpdateOperation();
            }
        }
    );
    

响应刷新操作

如果用户使用操作栏请求刷新,则系统会调用 onOptionsItemSelected() 方法。您的应用应通过显示进度指示器并刷新应用数据来响应此调用。

要响应刷新操作,请替换 onOptionsItemSelected()。在替换方法中,使用值 true,通过调用 setRefreshing() 触发 SwipeRefreshLayout 进度指示器,然后执行更新操作。再次强调,您应该在单独的方法中执行实际更新,这样无论用户是通过滑动手势还是使用操作栏触发更新,都会调用相同的方法。更新完成后,调用 setRefreshing(false) 以移除刷新进度指示器。

以下代码展示了如何响应请求操作:

Kotlin

    /*
     * Listen for option item selections so that we receive a notification
     * when the user requests a refresh by selecting the refresh action bar item.
     */
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {

            // Check if user triggered a refresh:
            R.id.menu_refresh -> {
                Log.i(LOG_TAG, "Refresh menu item selected")

                // Signal SwipeRefreshLayout to start the progress indicator
                mySwipeRefreshLayout.isRefreshing = true

                // Start the refresh background task.
                // This method calls setRefreshing(false) when it's finished.
                myUpdateOperation()

                return true
            }
        }

        // User didn't trigger a refresh, let the superclass handle this action
        return super.onOptionsItemSelected(item)
    }
    

Java

    /*
     * Listen for option item selections so that we receive a notification
     * when the user requests a refresh by selecting the refresh action bar item.
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            // Check if user triggered a refresh:
            case R.id.menu_refresh:
                Log.i(LOG_TAG, "Refresh menu item selected");

                // Signal SwipeRefreshLayout to start the progress indicator
                mySwipeRefreshLayout.setRefreshing(true);

                // Start the refresh background task.
                // This method calls setRefreshing(false) when it's finished.
                myUpdateOperation();

                return true;
        }

        // User didn't trigger a refresh, let the superclass handle this action
        return super.onOptionsItemSelected(item);
    }
    

注意:如果用户使用响应刷新手势中介绍的滑动操作触发刷新,您无需调用 setRefreshing()SwipeRefreshLayout 微件负责显示进度指示器,并在更新完成后将其移除。不过,如果用户通过滑动手势以外的任何方式触发更新,则您需要使用 setRefreshing() 明确启用进度指示器。实际刷新数据的方法会调用 setRefreshing(false) 来指示更新已完成。