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