RecyclerView สามารถแสดงข้อมูลจำนวนมากโดยใช้ทรัพยากรแบบกราฟิกน้อยที่สุด
ขณะที่ผู้ใช้เลื่อนดูสินค้าในRecyclerViewView
ระบบจะนำอินสแตนซ์ของสินค้าที่เลื่อนออกนอกหน้าจอไปแล้วมาใช้ซ้ำเพื่อสร้างสินค้าใหม่
ขณะที่ผู้ใช้เลื่อนดูบนหน้าจอ แต่การเปลี่ยนแปลงการกำหนดค่า เช่น การหมุนอุปกรณ์
สามารถรีเซ็ตสถานะของ RecyclerView ซึ่งบังคับให้ผู้ใช้ต้องเลื่อนไปยังตำแหน่งก่อนหน้าในรายการอีกครั้ง
RecyclerView ควรคงสถานะของตัวเองไว้ โดยเฉพาะตำแหน่งการเลื่อน และสถานะขององค์ประกอบรายการในระหว่างการเปลี่ยนแปลงการกำหนดค่าทั้งหมด
ผลลัพธ์
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 เพื่อบันทึกการเปลี่ยนแปลงข้อความ ภายใน
การเรียกกลับ ให้กำหนดข้อมูลที่จะบันทึก ดังนี้
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: เก็บสถานะสำหรับกิจกรรมหรือ Fragment
คอลเล็กชันที่มีคำแนะนำนี้
คู่มือนี้เป็นส่วนหนึ่งของคอลเล็กชันคู่มือฉบับย่อที่คัดสรรมาแล้ว ซึ่งครอบคลุมเป้าหมายการพัฒนา Android ในวงกว้าง