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.Adapter#setStateRestorationPolicy()
: מציין איךRecyclerView.Adapter
משחזר את המצב שלו אחרי שינוי בהגדרות.ViewModel
: שמירת המצב של פעילות או מקטע.
תוצאות
עכשיו אפשר לשחזר ב-RecyclerView
את מיקום הגלילה ואת המצב של כל פריט ברשימה RecyclerView
.
אוספים שמכילים את המדריך הזה
המדריך הזה הוא חלק מהאוספים של המדריכים המהירים שנבחרו במיוחד, שמכסים יעדים רחבים יותר לפיתוח Android:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=he)