จัดการสถานะ RecyclerView

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 ที่กว้างขึ้น ดังนี้

เปิดใช้แอปเพื่อรองรับประสบการณ์การใช้งานที่เพิ่มประสิทธิภาพในแท็บเล็ต อุปกรณ์แบบพับได้ และอุปกรณ์ ChromeOS

หากมีคำถามหรือความคิดเห็น

ไปที่หน้าคำถามที่พบบ่อยเพื่อดูคู่มือฉบับย่อหรือติดต่อเราเพื่อบอกความคิดเห็นของคุณ