ภาพรวมไลบรารี Paging   ส่วนหนึ่งของ Android Jetpack

Paging Library ช่วยให้คุณโหลดและแสดงหน้าข้อมูลจากชุดข้อมูลขนาดใหญ่ จากพื้นที่เก็บข้อมูลในเครื่องหรือผ่านเครือข่ายได้ แนวทางนี้ช่วยให้แอปใช้ ทั้งแบนด์วิดท์เครือข่ายและทรัพยากรของระบบได้อย่างมีประสิทธิภาพมากขึ้น คอมโพเนนต์ของ ไลบรารี Paging ออกแบบมาให้เหมาะกับสถาปัตยกรรม แอป Android ที่แนะนำ ผสานรวมกับคอมโพเนนต์ Jetpack อื่นๆ ได้อย่างราบรื่น และรองรับ Kotlin ระดับเฟิร์สคลาส

สิทธิประโยชน์ของการใช้ไลบรารีการแบ่งหน้า

ไลบรารีการแบ่งหน้ามีฟีเจอร์ต่อไปนี้

  • การแคชในหน่วยความจำสำหรับข้อมูลที่แบ่งหน้า ซึ่งจะช่วยให้มั่นใจได้ว่าแอปจะใช้ ทรัพยากรของระบบอย่างมีประสิทธิภาพขณะทำงานกับข้อมูลที่แบ่งเป็นหน้า
  • การขจัดคำขอที่ซ้ำกันในตัว ซึ่งช่วยให้มั่นใจได้ว่าแอปจะใช้แบนด์วิดท์เครือข่าย และทรัพยากรของระบบอย่างมีประสิทธิภาพ
  • การรองรับโครูทีนและโฟลว์ของ Kotlin อย่างเต็มรูปแบบ
  • การรองรับการจัดการข้อผิดพลาดในตัว รวมถึงความสามารถในการรีเฟรชและลองอีกครั้ง

ตั้งค่า

หากต้องการนำเข้าคอมโพเนนต์ Paging ไปยังแอป Android ให้เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในไฟล์ build.gradle ของแอป

Kotlin

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 Library ทำงานใน 3 เลเยอร์ของแอป

  • เลเยอร์ที่เก็บ
  • เลเยอร์ ViewModel
  • เลเยอร์ UI
รูปภาพแสดงโฟลว์ข้อมูลแบบแบ่งหน้าจากคอมโพเนนต์ PagingSource หรือ RemoteMediator ในเลเยอร์ที่เก็บไปยังคอมโพเนนต์ Pager ในเลเยอร์ ViewModel
    จากนั้นคอมโพเนนต์ Pager จะแสดง Flow ของ PagingData ไปยัง
    คอมโพเนนต์เลย์เอาต์แบบ Lazy ในเลเยอร์ UI
รูปที่ 1 ตัวอย่างวิธีที่ไลบรารีการแบ่งหน้าเหมาะกับสถาปัตยกรรมของแอป

ส่วนนี้จะอธิบายคอมโพเนนต์ของไลบรารีการแบ่งหน้าซึ่งทำงานในแต่ละเลเยอร์ และวิธีที่คอมโพเนนต์เหล่านี้ทำงานร่วมกันเพื่อโหลดและแสดงข้อมูลที่แบ่งหน้า

เลเยอร์ที่เก็บ

คอมโพเนนต์หลักของ Paging Library ในเลเยอร์ที่เก็บข้อมูลคือ PagingSource ออบเจ็กต์ PagingSource แต่ละรายการจะกำหนดแหล่งข้อมูลและวิธีกู้ข้อมูลจากแหล่งข้อมูลนั้น PagingSource ออบเจ็กต์สามารถโหลดข้อมูลจากแหล่งข้อมูลเดียว รวมถึงแหล่งข้อมูลเครือข่ายและฐานข้อมูลในเครื่อง

คอมโพเนนต์ไลบรารีการแบ่งหน้าอีกรายการที่คุณอาจใช้คือ RemoteMediator ออบเจ็กต์ A RemoteMediator จัดการการแบ่งหน้าจากแหล่งข้อมูลแบบเลเยอร์ เช่น แหล่งข้อมูลเครือข่ายที่มีแคชฐานข้อมูลในเครื่อง

เลเยอร์ ViewModel

คอมโพเนนต์ Pager มี API สาธารณะสําหรับสร้างอินสแตนซ์ของ PagingData ที่แสดงใน สตรีมแบบรีแอ็กทีฟ โดยอิงตามออบเจ็กต์ PagingSource และออบเจ็กต์การกําหนดค่า PagingConfig

คอมโพเนนต์ที่เชื่อมต่อเลเยอร์ ViewModel กับ UI คือ PagingData PagingData ออบเจ็กต์คือคอนเทนเนอร์สำหรับสแนปชอตของข้อมูลที่แบ่งหน้า โดยจะค้นหาออบเจ็กต์ a PagingSource และ จัดเก็บผลลัพธ์

เลเยอร์ UI

API ของ Paging UI หลักคือ collectAsLazyPagingItems() โดยจะแสดงรายการที่แบ่งหน้าเป็นรายการข้อมูลที่คอมโพสสามารถใช้คอมโพเนนต์เลย์เอาต์แบบเลซี เช่น LazyColumn และ LazyRow ได้อย่างง่ายดาย

เพิ่มไลบรารี androidx.paging:paging-compose เพื่อใช้ API ที่เข้ากันได้กับ Compose ซึ่งช่วยให้ UI ตอบสนองต่อการโหลด การอัปเดต และข้อผิดพลาดของข้อมูลโดยอัตโนมัติ โดยไม่ต้องใช้ตัวดัดแปลงหรือตรรกะการเปรียบเทียบ ใช้ฟังก์ชันส่วนขยาย 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()
            }
        }
    }
}

ดูข้อมูลเพิ่มเติมได้ที่ชุดข้อมูลขนาดใหญ่ (การแบ่งหน้า)