نمای کلی کتابخانه صفحه‌بندی   بخشی از Android Jetpack.

کتابخانه «صفحه‌بندی» به شما کمک می‌کند صفحه‌های داده را از مجموعه داده بزرگ‌تری از فضای ذخیره‌سازی محلی یا ازطریق شبکه بارگیری و نمایش دهید. این رویکرد به برنامه‌تان امکان می‌دهد هم از پهنای باند شبکه و هم از منابع سیستم به‌طور کارآمدتری استفاده کند. مؤلفه‌های کتابخانه Paging به‌گونه‌ای طراحی شده‌اند که با معماری برنامه Android توصیه‌شده مطابقت داشته باشند، به‌طور تمیز با سایر مؤلفه‌های Jetpack ادغام شوند، و پشتیبانی درجه یک Kotlin را ارائه دهند.

مزایای استفاده از کتابخانه Paging

کتابخانه Paging شامل ویژگی‌های زیر است:

  • ذخیره موقت درون حافظه برای داده‌های صفحه‌بندی‌شده شما. این کار کمک می‌کند مطمئن شوید برنامه‌تان هنگام کار با داده‌های صفحه‌بندی‌شده، به‌طور کارآمدی از منابع سیستم استفاده می‌کند.
  • حذف درخواست‌های تکراری داخلی که کمک می‌کند مطمئن شوید برنامه‌تان از پهنای باند شبکه و منابع سیستم به‌طور کارآمد استفاده می‌کند.
  • پشتیبانی درجه یک برای روال‌های مشترک و جریان‌های Kotlin.
  • پشتیبانی داخلی برای رسیدگی به خطا، ازجمله قابلیت‌های بازآوری و امتحان مجدد.

راه‌اندازی

برای وارد کردن مؤلفه‌های «صفحه‌بندی» به برنامه Android، وابستگی‌های زیر را به فایل build.gradle برنامه‌تان اضافه کنید:

کاتلین

dependencies {
  val paging_version = "3.4.2"

  implementation("androidx.paging:paging-common:$paging_version")

  // Jetpack Compose integration
  implementation("androidx.paging:paging-compose:$paging_version")
}

شیک

dependencies {
  def paging_version = "3.4.2"

  implementation "androidx.paging:paging-common:$paging_version"

  // Jetpack Compose integration
  implementation "androidx.paging:paging-compose:$paging_version"
}

معماری کتابخانه

مؤلفه‌های کتابخانه Paging در سه لایه از برنامه شما عمل می‌کنند:

  • لایه مخزن
  • لایه ViewModel
  • لایه واسط کاربر
تصویری که جریان داده‌های صفحه‌بندی‌شده را از مؤلفه‌های PagingSource یا RemoteMediator در لایه مخزن به مؤلفه Pager در لایه ViewModel نشان می‌دهد.
    سپس مؤلفه Pager یک Flow از PagingData را به مؤلفه‌های طرح‌بندی تنبل در لایه واسط کاربر نشان می‌دهد.
شکل ۱. نمونه‌ای از نحوه قرارگیری کتابخانه «صفحه‌بندی» در معماری برنامه شما.

این بخش مؤلفه‌های کتابخانه «صفحه‌بندی» را که در هر لایه عمل می‌کنند و نحوه همکاری آن‌ها برای بار کردن و نمایش داده‌های صفحه‌بندی‌شده را شرح می‌دهد.

لایه مخزن

مؤلفه اصلی کتابخانه «صفحه‌بندی» در لایه مخزن PagingSource است. هر شیء PagingSource منبع داده و نحوه بازیابی داده از آن منبع را تعریف می‌کند. شیء PagingSource می‌تواند داده‌ها را از هر منبع تکی، ازجمله منابع شبکه و پایگاه‌های داده محلی، بار کند.

یکی دیگر از مؤلفه‌های کتابخانه «صفحه‌بندی» که ممکن است استفاده کنید RemoteMediator است. شیء RemoteMediator صفحه‌بندی را از منبع داده لایه‌ای، مثل منبع داده شبکه با حافظه نهان پایگاه داده محلی، مدیریت می‌کند.

لایه ViewModel

مؤلفه Pager یک میانای برنامه‌سازی کاربردی عمومی برای ساختن نمونه‌های PagingData ارائه می‌دهد که در جاری‌سازی‌های واکنشی، براساس شیء PagingSource و شیء پیکربندی PagingConfig، نمایش داده می‌شوند.

مؤلفه‌ای که لایه ViewModel را به واسط کاربر متصل می‌کند PagingData است. شیء PagingData محفظه‌ای برای عکس آنی داده‌های صفحه‌بندی‌شده است. این روش شیء PagingSource را پُرسمان می‌کند و نتیجه را ذخیره می‌کند.

لایه واسط کاربر

میانای برنامه‌سازی کاربردی اصلی واسط کاربر صفحه‌بندی collectAsLazyPagingItems() است. این کتابخانه موارد صفحه‌بندی‌شده را به‌عنوان فهرستی از داده‌ها نمایش می‌دهد که به‌راحتی توسط مؤلفه‌های چیدمان تنبل Compose، مانند LazyColumn و LazyRow، قابل استفاده هستند.

کتابخانه androidx.paging:paging-compose را اضافه کنید تا از میاناهای برنامه‌سازی کاربردی سازگار با Compose استفاده کنید که به واسط کاربر اجازه می‌دهد به‌طور خودکار به بارگیری‌ها، به‌روزرسانی‌ها، و خطاهای داده واکنش نشان دهد بدون اینکه به آداپتورها یا منطق تفاضلی نیاز باشد. از تابع افزونه collectAsLazyPagingItems() در Flow<PagingData> استفاده کنید تا LazyPagingItems برگردانده‌شده را به items() در LazyColumn ارسال کنید.

@Composable
fun MessageList(pager: Pager<Int, Message>) {
    val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it.id }
        ) { index ->
            val message = lazyPagingItems[index]
            if (message != null) {
                MessageRow(message)
            } else {
                MessagePlaceholder()
            }
        }
    }
}

برای اطلاعات بیشتر، به مجموعه داده‌های بزرگ (صفحه‌بندی) مراجعه کنید.