RecyclerView הוא רכיב View שמאפשר להציג ביעילות מערכי נתונים גדולים. במקום ליצור תצוגות לכל פריט במערך הנתונים, RecyclerView משפרת את הביצועים של האפליקציה על ידי שמירה של מאגר קטן של תצוגות ושימוש חוזר בהן כשגוללים בין הפריטים.
במצב כתיבה, אפשר להשתמש ברשימות עצלניות כדי לבצע את אותה פעולה. בדף הזה מוסבר איך אפשר להעביר את ההטמעה של RecyclerView לשימוש ברשימות Lazy ב-Compose.
שלבים בהעברה
כדי להעביר את ההטמעה של RecyclerView ל-Compose, פועלים לפי השלבים הבאים:
מוסיפים הערה או מסירים את
RecyclerViewמההיררכיה של ממשק המשתמש, ומוסיפיםComposeViewבמקומו אם הוא עדיין לא קיים בהיררכיה. זהו הקונטיינר של הרשימה העצלנית שתוסיפו:<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>קובעים איזה סוג של Lazy list composable צריך בהתאם למנהל הפריסה של
RecyclerView(ראו טבלה בהמשך). האלמנט הניתן להרכבה שתבחרו יהיה האלמנט הניתן להרכבה ברמה העליונה שלComposeViewשהוספתם בשלב הקודם.LayoutManagerקומפוזבילי
LinearLayoutManagerLazyColumnאוLazyRowGridLayoutManagerLazyVerticalGridאוLazyHorizontalGridStaggeredGridLayoutManagerLazyVerticalStaggeredGridאוLazyHorizontalStaggeredGrid// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
יוצרים רכיב composable תואם לכל סוג תצוגה בהטמעה של
RecyclerView.Adapter. כל סוג תצוגה ממופה בדרך כלל למחלקת משנהViewHolder, אבל זה לא תמיד המצב. רכיבי ה-Composable האלה ישמשו כייצוג של ממשק המשתמש לסוגים שונים של רכיבים ברשימה:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
הלוגיקה בשיטות
RecyclerView.AdapterשלonCreateViewHolder()ו-onBindViewHolder()תוחלף ברכיבים הניתנים להרכבה האלה ובמצב שסיפקתם להם. ב-Compose, אין הפרדה בין יצירת רכיב שאפשר להרכיב ממנו רכיבים אחרים לפריט לבין קישור נתונים אליו – שני המושגים האלה מתמזגים.במשבצת
contentשל הרשימה העצלנית (הפרמטר האחרון של lambda), משתמשים בפונקציהitems()(או בעומס יתר שווה ערך) כדי לבצע איטרציה על הנתונים של הרשימה. ב-itemContentlambda, מפעילים את הפריט המתאים שאפשר להרכיב לנתונים:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
תרחישים נפוצים לדוגמה
קישוטים של פריטים
ב-RecyclerView יש מושג שנקרא ItemDecoration, שאפשר להשתמש בו כדי להוסיף ציור מיוחד לפריטים ברשימה. לדוגמה, אפשר להוסיף את התו ItemDecoration כדי להוסיף קווים להפרדה בין פריטים:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
אין ב-Compose מושג מקביל של קישוטי פריטים. במקום זאת, אפשר להוסיף ישירות את כל קישוטי ממשק המשתמש ברשימה בהודעה. לדוגמה, כדי להוסיף קווים מפרידים לרשימה, אפשר להשתמש ב-Divider composable אחרי כל פריט:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
אנימציות של פריטים
אפשר להגדיר ItemAnimator ב-RecyclerView כדי להנפיש את המראה של הפריטים כשמבצעים שינויים במתאם. כברירת מחדל, RecyclerView משתמש ב-DefaultItemAnimator, שמספק אנימציות בסיסיות באירועים של הסרה, הוספה והעברה.
לרשימות עצלות יש קונספט דומה באמצעות משנה animateItemPlacement.
מידע נוסף זמין במאמר בנושא אנימציות של פריטים.
מקורות מידע נוספים
מידע נוסף על העברת RecyclerView אל Compose זמין במקורות המידע הבאים:
- רשימות ורשתות: תיעוד שמסביר איך להטמיע רשימות ורשתות ב-Compose.
- Jetpack Compose Interop: Using Compose in a RecyclerView:
מאמר בבלוג בנושא שימוש יעיל ב-Compose בתוך
RecyclerView.
מומלץ בשבילכם
- הערה: טקסט הקישור מוצג כש-JavaScript מושבת
- רשימות ורשתות
- העברה של
CoordinatorLayoutאל Compose - שיקולים נוספים