ปรับแต่งรายการแบบไดนามิก ส่วนหนึ่งของ Android Jetpack
คุณสามารถปรับแต่ง
RecyclerView
ออบเจ็กต์ให้ตรงกับความต้องการเฉพาะได้ คลาสมาตรฐานที่อธิบายไว้ในสร้างรายการแบบไดนามิกด้วย
RecyclerView มีฟังก์ชันทั้งหมดที่นักพัฒนาแอปส่วนใหญ่ต้องการ ในหลายกรณี คุณเพียงแค่ต้องออกแบบมุมมองสำหรับผู้ถือมุมมองแต่ละรายและเขียนโค้ดเพื่ออัปเดตมุมมองเหล่านั้นด้วยข้อมูลที่เหมาะสม อย่างไรก็ตาม หากแอปมีข้อกำหนดเฉพาะ คุณสามารถแก้ไขลักษณะการทำงานมาตรฐานได้หลายวิธี
เอกสารนี้อธิบายการปรับแต่งบางอย่างที่เป็นไปได้
แก้ไขเลย์เอาต์
RecyclerView ใช้เครื่องมือจัดการเลย์เอาต์เพื่อจัดตำแหน่งแต่ละรายการบนหน้าจอ และเพื่อกำหนดเวลาที่จะนำมุมมองรายการที่ผู้ใช้มองไม่เห็นแล้วกลับมาใช้ซ้ำ หากต้องการนำมุมมองกลับมาใช้ซ้ำหรือรีไซเคิล มุมมองนั้น ผู้จัดการเลย์เอาต์อาจขอให้อะแดปเตอร์แทนที่เนื้อหาของมุมมองด้วยองค์ประกอบอื่นจากชุดข้อมูล การรีไซเคิลการดูด้วยวิธีนี้จะช่วยปรับปรุง
ประสิทธิภาพโดยหลีกเลี่ยงการสร้างการดูที่ไม่จำเป็นหรือการค้นหา
ที่มีค่าใช้จ่ายสูง
findViewById()
ไลบรารีการสนับสนุนของ Android มีเครื่องมือจัดการเลย์เอาต์มาตรฐาน 3 รายการ
ซึ่งแต่ละรายการมีตัวเลือกการปรับแต่งมากมาย
LinearLayoutManagerจัดเรียงรายการในรายการแบบมิติเดียว การใช้RecyclerViewกับLinearLayoutManagerจะมีฟังก์ชันการทำงานเหมือนกับเลย์เอาต์ListViewGridLayoutManagerจัดเรียงรายการในตารางแบบ 2 มิติ เช่น ช่องสี่เหลี่ยมบน กระดานหมากรุก การใช้RecyclerViewกับGridLayoutManagerจะมีฟังก์ชันการทำงานเหมือนกับเลย์เอาต์GridViewStaggeredGridLayoutManager: จัดเรียงรายการในตาราง 2 มิติ โดยแต่ละคอลัมน์จะออฟเซ็ตเล็กน้อย จากคอลัมน์ก่อนหน้า เช่นเดียวกับดาวบนธงชาติอเมริกา
หากตัวจัดการเลย์เอาต์เหล่านี้ไม่ตรงกับความต้องการ คุณก็สร้างตัวจัดการเลย์เอาต์ของคุณเองได้โดย
ขยาย
RecyclerView.LayoutManager
คลาสแบบนามธรรม
เพิ่มภาพเคลื่อนไหวของรายการ
เมื่อใดก็ตามที่ไอเทมมีการเปลี่ยนแปลง RecyclerView จะใช้แอนิเมเตอร์
เพื่อเปลี่ยนลักษณะที่ปรากฏ Animator นี้เป็นออบเจ็กต์ที่ขยายคลาส
RecyclerView.ItemAnimator
นามธรรม โดยค่าเริ่มต้น RecyclerView จะใช้
DefaultItemAnimator
เพื่อแสดงภาพเคลื่อนไหว หากต้องการระบุภาพเคลื่อนไหวที่กำหนดเอง คุณสามารถ
กำหนดออบเจ็กต์ Animator ของคุณเองได้โดยการขยาย
RecyclerView.ItemAnimator
เปิดใช้การเลือกรายการ
ไลบรารี
recyclerview-selection
ช่วยให้ผู้ใช้เลือกรายการในลิสต์ RecyclerView โดยใช้การแตะ
หรืออินพุตจากเมาส์ ซึ่งจะช่วยให้คุณยังคงควบคุมการนำเสนอภาพของ
รายการที่เลือกได้ นอกจากนี้ คุณยังคงควบคุมนโยบายที่ควบคุมลักษณะการทำงานของการเลือกได้ เช่น รายการใดมีสิทธิ์สำหรับการเลือกและเลือกได้กี่รายการ
หากต้องการเพิ่มการรองรับการเลือกไปยังอินสแตนซ์ RecyclerView ให้ทำตามขั้นตอนต่อไปนี้
- กำหนดประเภทคีย์การเลือกที่จะใช้ แล้วสร้าง
ItemKeyProviderคุณใช้ประเภทคีย์หลัก 3 ประเภทเพื่อระบุรายการที่เลือกได้ ดังนี้
Parcelableและคลาสย่อย เช่นUriStringLong
ดูข้อมูลโดยละเอียดเกี่ยวกับประเภทคีย์การเลือกได้ที่
SelectionTracker.Builder - ใช้งาน
ItemDetailsLookup - อัปเดตออบเจ็กต์
ViewในRecyclerViewเพื่อแสดงว่าผู้ใช้เลือกหรือ ยกเลิกการเลือกออบเจ็กต์ไลบรารีการเลือกไม่ได้ตกแต่งภาพเริ่มต้นสำหรับ รายการที่เลือก ระบุข้อมูลนี้เมื่อคุณติดตั้งใช้งาน
onBindViewHolder()เราขอแนะนำให้ใช้วิธีต่อไปนี้- ใน
onBindViewHolder()ให้เรียกsetActivated()—notsetSelected()—on ออบเจ็กต์Viewที่มีtrueหรือfalseขึ้นอยู่กับว่ามีการเลือกรายการ หรือไม่ - อัปเดตสไตล์ของมุมมองเพื่อแสดงสถานะที่เปิดใช้งาน เรา ขอแนะนำให้ใช้ทรัพยากรรายการสถานะสีเพื่อกำหนดค่าการจัดรูปแบบ
- ใน
- ใช้
ActionModeเพื่อมอบเครื่องมือให้ผู้ใช้ดำเนินการกับการเลือก - ดำเนินการรองที่ตีความแล้ว
- ประกอบทุกอย่างด้วย
SelectionTracker.Builder - รวมการเลือกในเหตุการณ์วงจร กิจกรรม
ItemDetailsLookup ช่วยให้คลังการเลือกเข้าถึง
ข้อมูลเกี่ยวกับรายการ RecyclerView ได้เมื่อระบุ MotionEvent
ซึ่งก็คือโรงงานสำหรับอินสแตนซ์ ItemDetails ที่ได้รับการสำรองข้อมูลหรือดึงข้อมูลจากอินสแตนซ์ RecyclerView.ViewHolder
ลงทะเบียน
SelectionTracker.SelectionObserver
เพื่อรับการแจ้งเตือนเมื่อมีการเปลี่ยนแปลงการเลือก เมื่อสร้างการเลือกเป็นครั้งแรก
ให้เริ่ม ActionMode เพื่อนำเสนอต่อผู้ใช้และระบุ
การดำเนินการเฉพาะการเลือก เช่น คุณสามารถเพิ่มปุ่มลบลงใน
ActionMode แถบและเชื่อมต่อลูกศรย้อนกลับในแถบเพื่อล้าง
การเลือก เมื่อไม่มีการเลือกแล้ว (หากผู้ใช้ล้างการเลือกครั้งล่าสุด) ให้สิ้นสุดโหมดการดำเนินการ
ที่ส่วนท้ายของไปป์ไลน์การประมวลผลเหตุการณ์ ไลบรารีอาจพิจารณา
ว่าผู้ใช้พยายามเปิดใช้งานรายการโดยการแตะ หรือพยายาม
ลากรายการหรือชุดรายการที่เลือก ตอบสนองต่อการตีความเหล่านี้
โดยลงทะเบียน Listener ที่เหมาะสม ดูข้อมูลเพิ่มเติมได้ที่
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 ด้วย ต้องใช้รหัสนี้เนื่องจาก
กิจกรรมหรือ Fragment อาจมีรายการที่เลือกได้และแตกต่างกันมากกว่า 1 รายการ
ซึ่งทั้งหมดต้องคงอยู่ในสถานะที่บันทึกไว้
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมได้ที่แหล่งอ้างอิงต่อไปนี้
- แอปเดโม Sunflowerซึ่งใช้
RecyclerView - Codelab ใช้ RecyclerView เพื่อแสดงรายการที่เลื่อนได้
- Android Kotlin Fundamentals: Codelab หลักพื้นฐานของ RecyclerView