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

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

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

שמירה על המצב

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

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

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

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) שדומה לטיפול של 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. מעבירים את מצב הפריט ל-constructor של המתאם כשיוצרים את המארח 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));
}

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

תוצאות

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

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

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

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

יש לכם שאלות או משוב

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