קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
התאמה אישית של רשימה דינמית
חלק מ-Android Jetpack.
כדאי לנסות את הדרך של כתיבת אימייל
Jetpack Compose היא ערכת הכלים המומלצת לבניית ממשק משתמש ל-Android. איך עובדים עם פריסות בכתיבת אימייל
אתם יכולים להתאים אישית את האובייקטים בהתאם לצרכים הספציפיים שלכם.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
.
יש שלושה סוגים עיקריים שאפשר להשתמש בהם כדי לזהות פריטים נבחרים:
מידע מפורט על סוגי מקשי בחירה זמין במאמר SelectionTracker.Builder
.
- הטמעה
ItemDetailsLookup
.
ItemDetailsLookup
מאפשר לספריית הבחירה לגשת למידע על פריטים של RecyclerView
בהינתן MotionEvent
.
היא למעשה מפעל ליצירת מופעים של ItemDetails
שמגובים על ידי מופע של RecyclerView.ViewHolder
או מחולצים ממנו.
- עדכון של אובייקטים מסוג item
View
ב-RecyclerView
כדי לשקף אם המשתמש בוחר אותם או מבטל את הבחירה בהם.
ספריית הבחירה לא מספקת קישוט חזותי כברירת מחדל לפריטים שנבחרו. צריך לספק את הערך הזה כשמטמיעים את onBindViewHolder()
.
אנחנו ממליצים על הגישה הבאה:
- משתמשים ב-
ActionMode
כדי לספק למשתמש כלים לביצוע פעולה בבחירה.
רושמים
SelectionTracker.SelectionObserver
כדי לקבל התראה כשמשנים את הבחירה. כשיוצרים בחירה בפעם הראשונה, מתחילים את ActionMode
כדי להציג אותה למשתמש ולספק פעולות ספציפיות לבחירה. לדוגמה, אפשר להוסיף לחלק ActionMode
כפתור מחיקה ולקשר את החץ 'הקודם' שבחלק כדי לנקות את הבחירה. כשאין יותר פריטים שנבחרו – אם המשתמש מנקה את הבחירה בפעם האחרונה – מצב הפעולה מסתיים.
- ביצוע פעולות משניות שפוענחו.
בסוף צינור העיבוד של האירועים, יכול להיות שהספרייה תקבע שהמשתמש מנסה להפעיל פריט, על ידי הקשה עליו, או שהוא מנסה לגרור פריט או קבוצה של פריטים נבחרים. מגיבים לפרשנויות האלה על ידי רישום של מאזין מתאים. מידע נוסף זמין במאמר SelectionTracker.Builder
.
- הרכבת הכול באמצעות
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
. המזהה הזה נדרש כי
יכול להיות שלפעילות או לקטע יהיו יותר מרשימה אחת נפרדת שאפשר לבחור ממנה,
וצריך לשמור את כל הרשימות האלה במצב השמור שלהן.
מקורות מידע נוספים
מידע נוסף מופיע במקורות הבאים.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-08-27 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2025-08-27 (שעון UTC)."],[],[],null,["# Customize a dynamic list\nPart of [Android Jetpack](/jetpack).\n=============================================================\n\nTry the Compose way \nJetpack Compose is the recommended UI toolkit for Android. Learn how to work with layouts in Compose. \n[Lazy Lists and Grids →](/jetpack/compose/lists#lazy) \n\nYou can customize\n[RecyclerView](/reference/androidx/recyclerview/widget/RecyclerView)\nobjects to meet your specific needs. The standard classes described in\n[Create dynamic lists with\nRecyclerView](/guide/topics/ui/layout/recyclerview) provide all the functionality that most developers need. In\nmany cases, you only need to design the view for each view holder and write the\ncode to update those views with the appropriate data. However, if your app has\nspecific requirements, you can modify the standard behavior in a number of ways.\nThis document describes some of the possible customizations.\n\nModify the layout\n-----------------\n\n`RecyclerView` uses a layout manager to position the individual\nitems on the screen and to determine when to reuse item views that are no longer\nvisible to the user. To reuse---or *recycle* ---a view, a layout\nmanager might ask the adapter to replace the contents of the view with a\ndifferent element from the dataset. Recycling views this way improves\nperformance by avoiding the creation of unnecessary views or performing\nexpensive\n[findViewById()](/reference/android/app/Activity#findViewById(int))\nlookups. The Android Support Library includes three standard layout managers,\nach of which offers many customization options:\n\n- [LinearLayoutManager](/reference/androidx/recyclerview/widget/LinearLayoutManager): arranges the items in a one-dimensional list. Using a `RecyclerView` with `LinearLayoutManager` provides functionality like a [ListView](/reference/android/widget/ListView) layout.\n- [GridLayoutManager](/reference/androidx/recyclerview/widget/GridLayoutManager): arranges the items in a two-dimensional grid, like the squares on a checkerboard. Using a `RecyclerView` with `GridLayoutManager` provides functionality like a [GridView](/reference/android/widget/GridView) layout.\n- [StaggeredGridLayoutManager](/reference/androidx/recyclerview/widget/StaggeredGridLayoutManager): arranges the items in a two-dimensional grid, with each column slightly offset from the one before, like the stars on an American flag.\n\nIf these layout managers don't suit your needs, you can create your own by\nextending the\n[RecyclerView.LayoutManager](/reference/androidx/recyclerview/widget/RecyclerView.LayoutManager)\nabstract class.\n\nAdd item animations\n-------------------\n\nWhenever an item changes, `RecyclerView` uses an *animator*\nto change its appearance. This animator is an object that extends the abstract\n[RecyclerView.ItemAnimator](/reference/androidx/recyclerview/widget/RecyclerView.ItemAnimator)\nclass. By default, the `RecyclerView` uses\n[DefaultItemAnimator](/reference/androidx/recyclerview/widget/DefaultItemAnimator)\nto provide the animation. If you want to provide custom animations, you can\ndefine your own animator object by extending\n`RecyclerView.ItemAnimator`.\n\nEnable list-item selection\n--------------------------\n\nThe\n[`recyclerview-selection`](/reference/androidx/recyclerview/selection/package-summary)\nlibrary lets users select items in a `RecyclerView` list using touch\nor mouse input. This lets you retain control over the visual presentation of a\nselected item. You can also retain control over policies controlling selection\nbehavior, such as which items are eligible for selection and how many items can\nbe selected.\n\nTo add selection support to a `RecyclerView` instance, follow\nthese steps:\n\n1. Determine which selection key type to use, then build an [`ItemKeyProvider`](/reference/androidx/recyclerview/selection/ItemKeyProvider).\n\n There are three key types you can use to identify selected items:\n - [Parcelable](/reference/android/os/Parcelable) and its subclasses, like [Uri](/reference/android/net/Uri)\n - [String](/reference/java/lang/String)\n - [Long](/reference/java/lang/Long)\n\n For detailed information about selection-key types, see\n [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n2. Implement [ItemDetailsLookup](/reference/androidx/recyclerview/selection/ItemDetailsLookup).\n3. `ItemDetailsLookup` lets the selection library access information about `RecyclerView` items given a [MotionEvent](/reference/android/view/MotionEvent). It is effectively a factory for [`ItemDetails`](/reference/androidx/recyclerview/selection/ItemDetailsLookup.ItemDetails) instances that are backed up by, or extracted from, a [RecyclerView.ViewHolder](/reference/androidx/recyclerview/widget/RecyclerView.ViewHolder) instance.\n4. Update item [View](/reference/android/view/View) objects in the `RecyclerView` to reflect whether the user selects or unselects them.\n\n The selection library doesn't provide a default visual decoration for the\n selected items. Provide this when you implement\n [onBindViewHolder()](/reference/androidx/recyclerview/widget/RecyclerView.Adapter#onBindViewHolder(VH, int)).\n We recommend the following approach:\n - In `onBindViewHolder()`, call [setActivated()](/reference/android/view/View#setActivated(boolean))---**not** [setSelected()](/reference/android/view/View#setSelected(boolean))---on the `View` object with `true` or `false`, depending on whether the item is selected.\n - Update the styling of the view to represent the activated status. We recommend using a [color state\n list resource](/guide/topics/resources/color-list-resource) to configure the styling.\n5. Use [ActionMode](/reference/androidx/appcompat/view/ActionMode) to provide the user with tools to perform an action on the selection.\n6. Register a [SelectionTracker.SelectionObserver](/reference/androidx/recyclerview/selection/SelectionTracker.SelectionObserver) to be notified when a selection changes. When a selection is first created, start `ActionMode` to present this to the user and provide selection-specific actions. For example, you can add a delete button to the `ActionMode` bar and connect the back arrow on the bar to clear the selection. When the selection becomes empty---if the user clears the selection the last time---terminate action mode.\n7. Perform any interpreted secondary actions.\n8. At the end of the event processing pipeline, the library might determine that the user is attempting to activate an item, by tapping it, or is attempting to drag an item or set of selected items. React to these interpretations by registering the appropriate listener. For more information, see [SelectionTracker.Builder](/reference/androidx/recyclerview/selection/SelectionTracker.Builder).\n9. Assemble everything with `SelectionTracker.Builder`.\n10. The following example shows how to put these pieces together: \n\n### Kotlin\n\n```kotlin\n var tracker = SelectionTracker.Builder(\n \"my-selection-id\",\n recyclerView,\n StableIdKeyProvider(recyclerView),\n MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build()\n \n```\n\n### Java\n\n```java\n SelectionTracker tracker = new SelectionTracker.Builder\u003c\u003e(\n \"my-selection-id\",\n recyclerView,\n new StableIdKeyProvider(recyclerView),\n new MyDetailsLookup(recyclerView),\n StorageStrategy.createLongStorage())\n .withOnItemActivatedListener(myItemActivatedListener)\n .build();\n \n```\n11. To build a [SelectionTracker](/reference/androidx/recyclerview/selection/SelectionTracker) instance, your app must supply the same [RecyclerView.Adapter](/reference/androidx/recyclerview/widget/RecyclerView.Adapter) that you use to initialize `RecyclerView` to `SelectionTracker.Builder`. For this reason, after you create the `SelectionTracker` instance, inject it into your `RecyclerView.Adapter`. Otherwise, you can't check an item's selected status from the `onBindViewHolder()` method.\n12. Include selection in the [activity\n lifecycle](/guide/components/activities/activity-lifecycle) events.\n13. To preserve selection state across the activity lifecycle events, your app must call the selection tracker's [onSaveInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/androidx/recyclerview/selection/SelectionTracker#onRestoreInstanceState(android.os.Bundle)) methods from the activity's [onSaveInstanceState()](/reference/android/app/Activity#onSaveInstanceState(android.os.Bundle)) and [onRestoreInstanceState()](/reference/android/app/Activity#onRestoreInstanceState(android.os.Bundle)) methods, respectively. Your app must also supply a unique selection ID to the `SelectionTracker.Builder` constructor. This ID is required because an activity or a fragment might have more than one distinct, selectable list, all of which need to be persisted in their saved state.\n\nAdditional resources\n--------------------\n\nSee the following references for additional information.\n\n- [Sunflower\n demo app](https://github.com/googlesamples/android-sunflower), which uses `RecyclerView`.\n- [Use\n RecyclerView to display a scrollable list](/codelabs/basic-android-kotlin-training-recyclerview-scrollable-list#0) codelab.\n- [Android\n Kotlin Fundamentals: RecyclerView fundamentals](/codelabs/kotlin-android-training-recyclerview-fundamentals) codelab."]]