إدارة حالة 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، أضِف دالّة callback مشابهة لمعالج 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 استعادة موضع التمرير وحالة كل عنصر في قائمة RecyclerView.

المجموعات التي تتضمّن هذا الدليل

هذا الدليل هو جزء من مجموعات "الأدلة السريعة" المنظَّمة التي تتناول أهدافًا أوسع في تطوير تطبيقات Android:

يمكنك إتاحة تطبيقك لتقديم تجربة محسّنة للمستخدمين على الأجهزة اللوحية والأجهزة القابلة للطي وأجهزة ChromeOS.

إذا كانت لديك أسئلة أو ملاحظات

يمكنك الانتقال إلى صفحة الأسئلة الشائعة والاطّلاع على الأدلة السريعة أو التواصل معنا وإعلامنا برأيك.