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

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 ในวงกว้าง

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

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

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