איך עונים לבקשה לרענון

אפשר לנסות את הדרך של כתיבת הודעה
‫Jetpack Compose היא ערכת הכלים המומלצת לבניית ממשק משתמש ב-Android. איך מרעננים את המסך בכלי הכתיבה

במאמר הזה מוסבר איך לעדכן את האפליקציה כשמשתמש מבקש רענון ידני, בין אם הוא מפעיל אותו באמצעות תנועת החלקה או באמצעות פעולת הרענון בסרגל הפעולות.

תגובה לתנועת הרענון

כשהמשתמש מבצע את תנועת ההחלקה לרענון, המערכת מציגה את מחוון ההתקדמות ומפעילה את שיטת הקריאה החוזרת של האפליקציה. שיטת הקריאה החוזרת שלך אחראית לעדכון הנתונים של האפליקציה.

כדי להגיב לתנועת הרענון באפליקציה, צריך להטמיע את הממשק SwipeRefreshLayout.OnRefreshListener ואת ה-method onRefresh() שלו. השיטה onRefresh() מופעלת כשהמשתמש מבצע תנועת החלקה.

כדאי להוסיף את הקוד של פעולת העדכון בפועל לשיטה נפרדת, רצוי ב-ViewModel, ולהפעיל את שיטת העדכון הזו מההטמעה של onRefresh(). כך תוכלו להשתמש באותה שיטת עדכון כדי לבצע את העדכון כשהמשתמש מפעיל רענון מסרגל הפעולות.

בשיטת העדכון, קוראים ל-setRefreshing(false) כשהעדכון של הנתונים מסתיים. הפעלת ה-method הזו מורה ל-SwipeRefreshLayout להסיר את אינדיקטור ההתקדמות ולעדכן את התוכן של התצוגה.

לדוגמה, בקוד הבא מוגדרת הפונקציה onRefresh() והמתודה myUpdateOperation() מופעלת כדי לעדכן את הנתונים שמוצגים על ידי ListView:

Kotlin

// Sets up a SwipeRefreshLayout.OnRefreshListener that invokes 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 and calls
    // setRefreshing(false) when it finishes.
    myUpdateOperation()
}

Java

// 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 and calls
    // setRefreshing(false) when it finishes.
    myUpdateOperation();
  }
);

תגובה לפעולת הרענון

אם המשתמש מבקש רענון באמצעות סרגל הפעולות, המערכת קוראת לשיטה onOptionsItemSelected(). האפליקציה מגיבה לקריאה הזו על ידי הצגת מדד ההתקדמות ורענון הנתונים של האפליקציה.

כדי להגיב לפעולת הרענון, מחליפים את onOptionsItemSelected(). בשיטת ההחלפה, מפעילים את SwipeRefreshLayout אינדיקטור ההתקדמות על ידי קריאה ל-setRefreshing() עם הערך true, ואז מבצעים את פעולת העדכון. מבצעים את העדכון בפועל בשיטה נפרדת, כדי שאפשר יהיה לקרוא לאותה שיטה גם אם המשתמש מפעיל את העדכון בהחלקה וגם אם הוא משתמש בסרגל הפעולות. כשהעדכון מסתיים, מתקשרים אל setRefreshing(false) כדי להסיר את אינדיקטור ההתקדמות של הרענון.

בדוגמה הבאה אפשר לראות איך להגיב לפעולת הבקשה:

Kotlin

// Listen for option item selections to 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 whether the user triggers 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 finishes.
            myUpdateOperation()

            return true
        }
    }

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

Java

// Listen for option item selections to 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 whether the user triggers 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 finishes.
            myUpdateOperation();

            return true;
    }

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