ניהול המצב של RecyclerView

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

RecyclerView צריך לשמור על המצב שלו – במיוחד על מיקום הגלילה – ועל המצב של רכיבי הרשימה שלו במהלך כל השינויים בהגדרות.

תוצאות

אפשר לשחזר את מיקום הגלילה של RecyclerView ואת המצב של כל פריט ברשימה RecyclerView.

שמירה על המצב

מגדירים את מדיניות שחזור המצב של RecyclerView.Adapter כדי לשמור את מיקום הגלילה RecyclerView. שמירת המצב של פריטים ברשימה RecyclerView. מוסיפים את המצב של הפריטים ברשימה למתאם RecyclerView, ומשחזרים את המצב של הפריטים ברשימה כשהם מקושרים ל-ViewHolder.

1. הפעלת מדיניות לשחזור מצב Adapter

מפעילים את מדיניות שחזור המצב של המתאם RecyclerView כדי לשמור על מיקום הגלילה של RecyclerView כשמשנים את ההגדרות. מוסיפים את הגדרת המדיניות לקונסטרוקטור של המתאם:

Kotlin

class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    init {
        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
    }
    ...
}

Java

class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public Adapter() {
        setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY);
    }
    ...
}

2. שמירת המצב של פריטים ברשימה עם שמירת מצב

שמירת המצב של פריטים מורכבים ברשימת RecyclerView, כמו פריטים שמכילים רכיבי EditText. לדוגמה, כדי לשמור את המצב של EditText, מוסיפים קריאה חוזרת (callback) שדומה ל-handler של onClick כדי לתעד שינויים בטקסט. בתוך פונקציית הקריאה החוזרת, מגדירים אילו נתונים לשמור:

Kotlin

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

Java

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

מצהירים על הקריאה החוזרת ב-Activity או ב-Fragment. משתמשים בViewModel כדי לאחסן את המצב.

3. הוספת מצב של פריט ברשימה ל-Adapter

מוסיפים את המצב של הפריטים ברשימה ל-RecyclerView.Adapter. מעבירים את מצב הפריט לבנאי של המתאם כשיוצרים את המארח Activity או Fragment:

Kotlin

val adapter = MyAdapter(items, viewModel.retrieveState())

Java

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. שחזור מצב של פריט ברשימה ב-ViewHolder של המתאם

ב-RecyclerView.Adapter, כשמקשרים ViewHolder לפריט, משחזרים את מצב הפריט:

Kotlin

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    ...
    val item = items[position]
    val state = states.firstOrNull { it.item == item }

    if (state != null) {
        holder.restore(state)
    }
}

Java

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    ...
    Item item = items[position];
    Arrays.stream(states).filter(state -> state.item == item)
        .findFirst()
        .ifPresent(state -> holder.restore(state));
}

נקודות עיקריות

אוספים שכוללים את המדריך הזה

המדריך הזה הוא חלק מאוספים של מדריכים מהירים שנבחרו בקפידה ועוסקים ביעדים רחבים יותר של פיתוח ל-Android:

כדאי להוסיף לאפליקציה תמיכה בחוויית משתמש אופטימלית בטאבלטים, במכשירים מתקפלים ובמכשירי ChromeOS.

יש לך שאלות או משוב?

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