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)); }
נקודות עיקריות
-
RecyclerView.Adapter#setStateRestorationPolicy()
: מציין איךRecyclerView.Adapter
משחזר את המצב שלו אחרי שינוי בהגדרות. -
ViewModel
: מכיל את הסטטוס של פעילות או של קטע.
אוספים שכוללים את המדריך הזה
המדריך הזה הוא חלק מאוספים של מדריכים מהירים שנבחרו בקפידה ועוסקים ביעדים רחבים יותר של פיתוח ל-Android:
