إدارة حالة RecyclerView

يمكن لتطبيق 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));
}

النقاط الرئيسية

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

يشكّل هذا الدليل جزءًا من مجموعات &quot;الأدلة السريعة&quot; المنسّقة التي تغطي أهدافًا أوسع نطاقًا لتطوير تطبيقات Android، وهي:

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

هل لديك أسئلة أو ملاحظات؟

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