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: