התאמה אישית של רשימה דינמית חלק מ-Android Jetpack.
אתם יכולים להתאים אישית את האובייקטים בהתאם לצרכים הספציפיים שלכם.RecyclerView
המחלקות הרגילות שמתוארות במאמר יצירת רשימות דינמיות באמצעות RecyclerView מספקות את כל הפונקציונליות שרוב המפתחים צריכים. במקרים רבים, צריך רק לתכנן את התצוגה של כל מחזיק תצוגה ולכתוב את הקוד לעדכון התצוגות האלה בנתונים המתאימים. עם זאת, אם לאפליקציה שלכם יש דרישות ספציפיות, אתם יכולים לשנות את ההתנהגות הרגילה בכמה דרכים.
במסמך הזה מתוארים כמה מההתאמות האישיות האפשריות.
שינוי הפריסה
RecyclerView
משתמש במנהל פריסות כדי למקם את הפריטים השונים במסך וכדי לקבוע מתי לעשות שימוש חוזר בתצוגות פריטים שכבר לא גלויות למשתמש. כדי לעשות שימוש חוזר בתצוגה, או למחזר אותה, יכול להיות שמנהל הפריסה יבקש מהמתאם להחליף את התוכן של התצוגה ברכיב אחר ממערך הנתונים. שימוש חוזר בתצוגות משפר את הביצועים כי הוא מונע יצירה של תצוגות מיותרות או ביצוע של חיפושים יקרים.findViewById()
ספריית התמיכה של Android כוללת שלושה מנהלי פריסה רגילים, שלכל אחד מהם יש הרבה אפשרויות התאמה אישית:
-
LinearLayoutManager
: מסדר את הפריטים ברשימה חד-ממדית. השימוש ב-RecyclerView
עםLinearLayoutManager
מספק פונקציונליות כמו פריסה שלListView
. -
GridLayoutManager
: מסדר את הפריטים ברשת דו-ממדית, כמו הריבועים בלוח שחמט. השימוש ב-RecyclerView
עםGridLayoutManager
מספק פונקציונליות כמו פריסה שלGridView
. -
StaggeredGridLayoutManager
: מסדר את הפריטים ברשת דו-ממדית, כשכל עמודה מוסטת מעט מהעמודה הקודמת, כמו הכוכבים בדגל ארה"ב.
אם מנהלי הפריסות האלה לא מתאימים לצרכים שלכם, אתם יכולים ליצור מנהל פריסות משלכם על ידי הרחבת המחלקה המופשטת RecyclerView.LayoutManager
.
הוספת אנימציות לפריטים
בכל פעם שפריט משתנה, RecyclerView
משתמש באנימטור
כדי לשנות את המראה שלו. האנימטור הזה הוא אובייקט שמרחיב את המחלקה המופשטת RecyclerView.ItemAnimator
. כברירת מחדל, RecyclerView
משתמש ב-DefaultItemAnimator
כדי לספק את האנימציה. אם רוצים לספק אנימציות בהתאמה אישית, אפשר להגדיר אובייקט אנימטור משלכם על ידי הרחבה של RecyclerView.ItemAnimator
.
הפעלת בחירת פריטים ברשימה
הספרייה
recyclerview-selection
מאפשרת למשתמשים לבחור פריטים ברשימת RecyclerView
באמצעות מגע או קלט עכבר. כך תוכלו לשמור על שליטה בהצגה החזותית של פריט נבחר. אתם יכולים גם לשמור על שליטה במדיניות שקובעת את התנהגות הבחירה, למשל אילו פריטים עומדים בדרישות לבחירה וכמה פריטים אפשר לבחור.
כדי להוסיף תמיכה בבחירה למופע של RecyclerView
, פועלים לפי השלבים הבאים:
- מחליטים באיזה סוג של מקש בחירה להשתמש, ואז יוצרים
ItemKeyProvider
.יש שלושה סוגים עיקריים שאפשר להשתמש בהם כדי לזהות פריטים נבחרים:
Parcelable
והמחלקות המשניות שלו, כמוUri
String
Long
מידע מפורט על סוגי מקשי בחירה זמין במאמר
SelectionTracker.Builder
. - הטמעה
ItemDetailsLookup
. - עדכון של אובייקטים מסוג item
View
ב-RecyclerView
כדי לשקף אם המשתמש בוחר אותם או מבטל את הבחירה בהם.ספריית הבחירה לא מספקת קישוט חזותי כברירת מחדל לפריטים שנבחרו. צריך לספק את הערך הזה כשמטמיעים את
onBindViewHolder()
. אנחנו ממליצים על הגישה הבאה:- ב-
onBindViewHolder()
, קוראים ל-setActivated()
—לא—setSelected()
באובייקטView
עםtrue
אוfalse
, בהתאם לבחירת הפריט. - מעדכנים את הסגנון של התצוגה כדי לייצג את הסטטוס המופעל. מומלץ להשתמש במשאב של רשימת מצבי צבע כדי להגדיר את הסגנון.
- ב-
- משתמשים ב-
ActionMode
כדי לספק למשתמש כלים לביצוע פעולה בבחירה. - ביצוע פעולות משניות שפוענחו.
- הרכבת הכול באמצעות
SelectionTracker.Builder
. - הכללת הבחירה באירועים של מחזור החיים של הפעילות.
ItemDetailsLookup
מאפשר לספריית הבחירה לגשת למידע על פריטים של RecyclerView
בהינתן MotionEvent
.
היא למעשה מפעל ליצירת מופעים של ItemDetails
שמגובים על ידי מופע של RecyclerView.ViewHolder
או מחולצים ממנו.
רושמים
SelectionTracker.SelectionObserver
כדי לקבל התראה כשמשנים את הבחירה. כשיוצרים בחירה בפעם הראשונה, מתחילים את ActionMode
כדי להציג אותה למשתמש ולספק פעולות ספציפיות לבחירה. לדוגמה, אפשר להוסיף כפתור מחיקה לסרגל ActionMode
ולחבר את החץ 'הקודם' בסרגל כדי לנקות את הבחירה. כשאין יותר פריטים שנבחרו – אם המשתמש מנקה את הבחירה בפעם האחרונה – מצב הפעולה מסתיים.
בסוף צינור העיבוד של האירועים, יכול להיות שהספרייה תקבע שהמשתמש מנסה להפעיל פריט, על ידי הקשה עליו, או שהוא מנסה לגרור פריט או קבוצה של פריטים שנבחרו. מגיבים לפרשנויות האלה על ידי רישום של שירות ההאזנה המתאים. מידע נוסף זמין במאמר SelectionTracker.Builder
.
בדוגמה הבאה אפשר לראות איך משלבים את כל החלקים:
Kotlin
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
Java
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
כדי ליצור מופע של SelectionTracker
, האפליקציה צריכה לספק את אותו RecyclerView.Adapter
שבו השתמשתם כדי לאתחל את RecyclerView
ל-SelectionTracker.Builder
. לכן, אחרי שיוצרים את מופע SelectionTracker
, צריך להוסיף אותו ל-RecyclerView.Adapter
. אחרת, אי אפשר לבדוק את הסטטוס של פריט שנבחר באמצעות השיטה onBindViewHolder()
.
כדי לשמור את מצב הבחירה לאורך אירועי מחזור החיים של הפעילות, האפליקציה צריכה לקרוא לשיטות onSaveInstanceState()
ו-onRestoreInstanceState()
של כלי המעקב אחר הבחירה מהשיטות onSaveInstanceState()
ו-onRestoreInstanceState()
של הפעילות, בהתאמה. בנוסף, האפליקציה צריכה לספק מזהה בחירה ייחודי לבונה SelectionTracker.Builder
. המזהה הזה נדרש כי
יכול להיות שלפעילות או לקטע יהיו יותר מרשימה אחת נפרדת שאפשר לבחור ממנה,
וצריך לשמור את כל הרשימות האלה במצב השמור שלהן.
מקורות מידע נוספים
מידע נוסף מופיע במקורות הבאים.
- אפליקציית ההדגמה Sunflowerשמשתמשת ב-
RecyclerView
. - Codelab בנושא שימוש ב-RecyclerView כדי להציג רשימה שאפשר לגלול בה
- Android Kotlin Fundamentals: RecyclerView fundamentals codelab.