يمكن لتطبيق 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)); }
النقاط الرئيسية
RecyclerView.Adapter#setStateRestorationPolicy()
: تحدّد هذه السمة الطريقة التي يستعيد بهاRecyclerView.Adapter
حالته بعد تغيير الإعدادات.-
ViewModel
: يحتوي على حالة نشاط أو جزء.
المجموعات التي تتضمّن هذا الدليل
يشكّل هذا الدليل جزءًا من مجموعات "الأدلة السريعة" المنسّقة التي تغطي أهدافًا أوسع نطاقًا لتطوير تطبيقات Android، وهي:
