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

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

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

תוצאות

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

תאימות גרסאות

ההטמעה הזו תואמת לכל רמות ה-API.

פניות קשורות

ללא.

שמירה על המצב

מגדירים את מדיניות שחזור המצב של 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.

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

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