ปรับแต่งรายการแบบไดนามิก   เป็นส่วนหนึ่งของ Android Jetpack

ลองใช้วิธีเขียน
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีทำงานกับเลย์เอาต์ในเครื่องมือเขียน

คุณปรับแต่ง RecyclerView ออบเจ็กต์ให้เหมาะกับความต้องการเฉพาะได้ คลาสมาตรฐานที่อธิบายในหัวข้อสร้างรายการแบบไดนามิกด้วย RecyclerView มีฟังก์ชันการทำงานทั้งหมดที่นักพัฒนาแอปส่วนใหญ่ต้องการ ในหลายกรณี คุณเพียงต้องออกแบบมุมมองสําหรับตัวยึดตำแหน่งแต่ละรายการและเขียนโค้ดเพื่ออัปเดตมุมมองเหล่านั้นด้วยข้อมูลที่ถูกต้อง อย่างไรก็ตาม หากแอปมีข้อกําหนดเฉพาะ คุณสามารถแก้ไขลักษณะการทํางานมาตรฐานได้หลายวิธี เอกสารนี้จะอธิบายการปรับแต่งที่เป็นไปได้บางส่วน

แก้ไขเลย์เอาต์

RecyclerView ใช้ตัวจัดการเลย์เอาต์เพื่อจัดตำแหน่งแต่ละรายการบนหน้าจอและกำหนดเวลาที่จะนำมุมมองรายการที่ผู้ใช้ไม่เห็นแล้วกลับมาใช้ใหม่ หากต้องการนํามุมมองมาใช้ซ้ำหรือรีไซเคิล เครื่องมือจัดการเลย์เอาต์อาจขอให้อะแดปเตอร์แทนที่เนื้อหาของมุมมองด้วยองค์ประกอบอื่นจากชุดข้อมูล การรีไซเคิลมุมมองด้วยวิธีนี้จะช่วยปรับปรุงประสิทธิภาพด้วยการหลีกเลี่ยงการสร้างมุมมองที่ไม่จำเป็นหรือการดำเนินการค้นหาfindViewById()ที่มีค่าใช้จ่ายสูง ไลบรารีการสนับสนุนของ Android มีเครื่องมือจัดการเลย์เอาต์มาตรฐาน 3 รายการ ซึ่งแต่ละรายการมีตัวเลือกการปรับแต่งมากมาย ดังนี้

  • LinearLayoutManager: จัดเรียงรายการในลิสต์มิติข้อมูลเดียว การใช้ RecyclerView กับ LinearLayoutManager จะให้ฟังก์ชันการทำงานเหมือนกับเลย์เอาต์ ListView
  • GridLayoutManager: จัดเรียงรายการในตาราง 2 มิติ เช่น สี่เหลี่ยมจัตุรัสบนกระดานหมากรุก การใช้ RecyclerView กับ GridLayoutManager จะให้ฟังก์ชันการทำงานเหมือนกับเลย์เอาต์ GridView
  • StaggeredGridLayoutManager: จัดเรียงรายการในตารางกริด 2 มิติ โดยแต่ละคอลัมน์จะเลื่อนออกไปจากคอลัมน์ก่อนหน้าเล็กน้อย เช่น ดาวบนธงชาติอเมริกัน

หากเครื่องมือจัดการเลย์เอาต์เหล่านี้ไม่เหมาะกับความต้องการของคุณ คุณก็สร้างเครื่องมือจัดการเองได้โดยการขยายRecyclerView.LayoutManagerคลาส抽象

เพิ่มภาพเคลื่อนไหวของสินค้า

ทุกครั้งที่มีการเปลี่ยนแปลงรายการ RecyclerView จะใช้อนิเมเตอร์เพื่อเปลี่ยนลักษณะที่ปรากฏ อนิเมเตอร์นี้เป็นออบเจ็กต์ที่ขยายคลาส RecyclerView.ItemAnimator แบบนามธรรม โดยค่าเริ่มต้น RecyclerView จะใช้ DefaultItemAnimatorเพื่อแสดงภาพเคลื่อนไหว หากต้องการระบุภาพเคลื่อนไหวที่กําหนดเอง คุณสามารถกําหนดออบเจ็กต์ Animator ของคุณเองได้โดยขยายRecyclerView.ItemAnimator

เปิดใช้การเลือกรายการในลิสต์

ไลบรารี recyclerview-selection ช่วยให้ผู้ใช้เลือกรายการในรายการ RecyclerView ได้โดยใช้การป้อนข้อมูลด้วยการสัมผัสหรือเมาส์ ซึ่งจะช่วยให้คุณควบคุมการแสดงภาพรายการที่เลือกได้ นอกจากนี้ คุณยังควบคุมนโยบายที่ควบคุมลักษณะการทํางานของการเลือกได้ด้วย เช่น รายการที่มีสิทธิ์เลือกและจํานวนรายการที่เลือกได้

หากต้องการเพิ่มการรองรับการเลือกลงในอินสแตนซ์ RecyclerView ให้ทำตามขั้นตอนต่อไปนี้

  1. เลือกประเภทคีย์การเลือกที่จะใช้ แล้วสร้าง ItemKeyProvider

    คุณสามารถระบุรายการที่เลือกได้โดยใช้คีย์ 3 ประเภทต่อไปนี้

    ดูรายละเอียดเกี่ยวกับประเภทคีย์การเลือกได้ที่ SelectionTracker.Builder

  2. ใช้งาน ItemDetailsLookup
  3. ItemDetailsLookup อนุญาตให้คลังการเลือกเข้าถึงข้อมูลเกี่ยวกับรายการ RecyclerView ที่ได้รับ MotionEvent อินสแตนซ์นี้เปรียบเสมือนโรงงานสำหรับItemDetailsอินสแตนซ์ที่ได้รับการสํารองข้อมูลหรือดึงมาจากRecyclerView.ViewHolderอินสแตนซ์

  4. อัปเดตออบเจ็กต์ View ใน RecyclerView เพื่อแสดงว่าผู้ใช้เลือกหรือยกเลิกการเลือกออบเจ็กต์หรือไม่

    คลังรายการที่เลือกไม่มีการตกแต่งภาพเริ่มต้นสำหรับรายการที่เลือก ระบุข้อมูลนี้เมื่อติดตั้งใช้งาน onBindViewHolder() เราขอแนะนําแนวทางต่อไปนี้

    • ใน onBindViewHolder() ให้เรียกใช้ setActivated()not setSelected() บนออบเจ็กต์ View ด้วย true หรือ false โดยขึ้นอยู่กับว่ามีการเลือกรายการหรือไม่
    • อัปเดตการจัดรูปแบบของมุมมองเพื่อแสดงสถานะที่เปิดใช้งาน เราขอแนะนำให้ใช้ทรัพยากรรายการสถานะสีเพื่อกำหนดค่าการจัดรูปแบบ
  5. ใช้ ActionMode เพื่อให้ผู้ใช้มีเครื่องมือในการดําเนินการกับสิ่งที่เลือก
  6. ลงทะเบียน SelectionTracker.SelectionObserver เพื่อรับการแจ้งเตือนเมื่อมีการเปลี่ยนแปลงรายการที่เลือก เมื่อสร้างการเลือกเป็นครั้งแรก ให้เริ่ม ActionMode เพื่อแสดงการเลือกนี้ต่อผู้ใช้และดำเนินการเฉพาะการเลือก เช่น คุณสามารถเพิ่มปุ่มลบลงในแถบ ActionMode และเชื่อมต่อลูกศรย้อนกลับในแถบเพื่อล้างการเลือก เมื่อไม่มีรายการที่เลือกแล้ว (หากผู้ใช้ล้างการเลือกครั้งล่าสุด) ให้สิ้นสุดโหมดการดำเนินการ

  7. ดำเนินการรองที่ตีความ
  8. เมื่อถึงจุดสิ้นสุดของไปป์ไลน์การประมวลผลเหตุการณ์ คลังอาจระบุว่าผู้ใช้พยายามเปิดใช้งานรายการโดยการแตะ หรือพยายามลากรายการหรือชุดรายการที่เลือก ตอบสนองต่อคําอธิบายเหล่านี้โดยลงทะเบียนโปรแกรมฟังที่เหมาะสม ดูข้อมูลเพิ่มเติมได้ที่ SelectionTracker.Builder

  9. รวบรวมทุกอย่างด้วย SelectionTracker.Builder
  10. ตัวอย่างต่อไปนี้แสดงวิธีรวมข้อมูลเหล่านี้เข้าด้วยกัน

    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() ไม่ได้

  11. รวมการเลือกไว้ในเหตุการณ์วงจรของกิจกรรม
  12. หากต้องการเก็บรักษาสถานะการเลือกในเหตุการณ์ตลอดวงจรกิจกรรม แอปของคุณต้องเรียกใช้เมธอด onSaveInstanceState() และ onRestoreInstanceState() ของเครื่องมือติดตามการเลือกจากเมธอด onSaveInstanceState() และ onRestoreInstanceState() ของกิจกรรมตามลำดับ นอกจากนี้ แอปของคุณยังต้องระบุรหัสการเลือกที่ไม่ซ้ำกันให้กับตัวสร้าง SelectionTracker.Builder ด้วย คุณต้องใช้รหัสนี้เนื่องจากกิจกรรมหรือข้อมูลโค้ดอาจมีรายการที่เลือกได้ซึ่งแตกต่างกันมากกว่า 1 รายการ ซึ่งรายการทั้งหมดต้องคงอยู่ในสถานะที่บันทึกไว้

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมจากข้อมูลอ้างอิงต่อไปนี้