RecyclerView
สามารถแสดงข้อมูลจํานวนมากโดยใช้ทรัพยากรกราฟิกเพียงเล็กน้อย เมื่อผู้ใช้เลื่อนดูรายการใน RecyclerView
View
ระบบจะใช้อินสแตนซ์ของรายการที่เลื่อนออกไปนอกหน้าจอซ้ำเพื่อสร้างรายการใหม่ขณะที่ผู้ใช้เลื่อนดูบนหน้าจอ แต่การเปลี่ยนแปลงการกำหนดค่า เช่น การหมุนอุปกรณ์ อาจรีเซ็ตสถานะของ RecyclerView
ซึ่งจะทำให้ผู้ใช้ต้องเลื่อนไปยังตำแหน่งก่อนหน้าในรายการรายการอีกครั้ง
RecyclerView
ควรรักษาสถานะไว้ โดยเฉพาะตำแหน่งการเลื่อน และสถานะขององค์ประกอบรายการในระหว่างการเปลี่ยนแปลงการกำหนดค่าทั้งหมด
คงสถานะ
ตั้งค่านโยบายการคืนค่าสถานะของ RecyclerView.Adapter
เพื่อบันทึกตำแหน่งการเลื่อนของ RecyclerView
บันทึกสถานะของรายการในรายการ RecyclerView
เพิ่มสถานะของรายการในรายการไปยังอะแดปเตอร์ RecyclerView
และกู้คืนสถานะของรายการในรายการเมื่อมีการเชื่อมโยงกับ ViewHolder
1. เปิดใช้นโยบายการกู้คืนสถานะ Adapter
เปิดใช้นโยบายการคืนค่าสถานะของอะแดปเตอร์ RecyclerView
เพื่อให้ตำแหน่งการเลื่อนของ RecyclerView
คงที่เมื่อมีการเปลี่ยนแปลงการกำหนดค่า เพิ่มข้อกําหนดของนโยบายลงในตัวสร้างอะแดปเตอร์
Kotlin
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
Java
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
2. บันทึกสถานะของรายการในลิสต์ที่มีสถานะ
บันทึกสถานะของรายการ RecyclerView
ที่ซับซ้อน เช่น รายการที่มีองค์ประกอบ EditText
เช่น หากต้องการบันทึกสถานะของ EditText
ให้เพิ่มการเรียกกลับที่คล้ายกับตัวแฮนเดิล onClick
เพื่อบันทึกการเปลี่ยนแปลงข้อความ ภายใน callback ให้กําหนดข้อมูลที่จะบันทึก ดังนี้
Kotlin
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Java
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
ประกาศการเรียกกลับใน Activity
หรือ Fragment
ใช้ ViewModel
เพื่อเก็บสถานะ
3. เพิ่มสถานะรายการในลิสต์ลงใน Adapter
เพิ่มสถานะของรายการในรายการลงใน RecyclerView.Adapter
ส่งสถานะรายการไปที่ตัวสร้างอะแดปเตอร์เมื่อสร้างโฮสต์ Activity
หรือ Fragment
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. กู้คืนสถานะรายการใน ViewHolder
ของอะแดปเตอร์
ใน RecyclerView.Adapter
เมื่อคุณเชื่อมโยง ViewHolder
กับรายการ ให้กู้คืนสถานะของรายการโดยทำดังนี้
Kotlin
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { ... val item = items[position] val state = states.firstOrNull { it.item == item } if (state != null) { holder.restore(state) } }
Java
@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { ... Item item = items[position]; Arrays.stream(states).filter(state -> state.item == item) .findFirst() .ifPresent(state -> holder.restore(state)); }
ข้อมูลสำคัญ
RecyclerView.Adapter#setStateRestorationPolicy()
: ระบุวิธีฟื้นฟูสถานะของRecyclerView.Adapter
หลังจากการเปลี่ยนแปลงการกําหนดค่าViewModel
: เก็บสถานะสำหรับกิจกรรมหรือแฟรกเมนต์
ผลลัพธ์
ตอนนี้ RecyclerView
กู้คืนตำแหน่งการเลื่อนและสถานะของทุกรายการในรายการ RecyclerView
ได้แล้ว
คอลเล็กชันที่มีคู่มือนี้
คู่มือนี้เป็นส่วนหนึ่งของคอลเล็กชันคู่มือฉบับย่อที่มีการดูแลจัดการซึ่งครอบคลุมเป้าหมายการพัฒนา Android ที่กว้างขึ้น ดังนี้
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=th)