يمكن 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.Adapter#setStateRestorationPolicy()
: لتحديد كيفية استعادةRecyclerView.Adapter
حالته بعد تغيير الإعدادات -
ViewModel
: تحافظ على حالة نشاط أو جزء.
النتائج
يمكن الآن لجهاز RecyclerView
استعادة موضع التمرير وحالة
كل عنصر في قائمة RecyclerView
.
المجموعات التي تتضمّن هذا الدليل
هذا الدليل هو جزء من مجموعات "الأدلة السريعة" المنظَّمة التي تتناول أهدافًا أوسع في تطوير تطبيقات Android:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=ar)