RecyclerView
میتواند حجم زیادی از دادهها را با استفاده از حداقل منابع گرافیکی نمایش دهد. همانطور که کاربران در RecyclerView
در حال پیمایش آیتمها هستند، نمونههای View
از آیتمهایی که از صفحه خارج شدهاند، هنگام پیمایش روی صفحه، برای ایجاد آیتمهای جدید دوباره استفاده میشوند. اما تغییرات پیکربندی، مانند چرخش دستگاه، میتواند وضعیت RecyclerView
را مجدداً تنظیم کند و کاربران را مجبور کند دوباره به موقعیت قبلی خود در لیست آیتمها پیمایش کنند.
RecyclerView
باید وضعیت خود - به ویژه موقعیت اسکرول - و وضعیت عناصر لیست خود را در طول تمام تغییرات پیکربندی حفظ کند.
نتایج
RecyclerView
شما قادر است موقعیت اسکرول خود و وضعیت هر آیتم در لیست RecyclerView
را بازیابی کند.
حفظ حالت
سیاست بازیابی وضعیت RecyclerView.Adapter
را طوری تنظیم کنید که موقعیت اسکرول RecyclerView
ذخیره کند. وضعیت آیتمهای لیست RecyclerView
را ذخیره کند. وضعیت آیتمهای لیست را به آداپتور RecyclerView
اضافه کند و وضعیت آیتمهای لیست را هنگامی که به یک ViewHolder
متصل میشوند، بازیابی کند.
۱. فعال کردن سیاست بازیابی وضعیت Adapter
سیاست بازیابی وضعیت آداپتور RecyclerView
را فعال کنید تا موقعیت پیمایش RecyclerView
در طول تغییرات پیکربندی حفظ شود. مشخصات سیاست را به سازنده آداپتور اضافه کنید:
کاتلین
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
جاوا
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
۲. ذخیره وضعیت آیتمهای لیست با وضعیت
وضعیت آیتمهای پیچیدهی لیست RecyclerView
، مانند آیتمهایی که حاوی عناصر EditText
هستند را ذخیره کنید. برای مثال، برای ذخیرهی وضعیت یک EditText
، یک تابع فراخوانی مشابه با onClick
handler برای ثبت تغییرات متن اضافه کنید. درون این تابع فراخوانی، دادههایی که باید ذخیره شوند را تعریف کنید:
کاتلین
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
جاوا
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
تابع فراخوانی (callback) را در Activity
یا Fragment
خود تعریف کنید. از ViewModel
برای ذخیره حالت (state) استفاده کنید.
۳. اضافه کردن وضعیت آیتم لیست به Adapter
وضعیت آیتمهای لیست را به RecyclerView.Adapter
خود اضافه کنید. وضعیت آیتم را هنگام ایجاد Activity
یا Fragment
میزبان به سازنده آداپتور ارسال کنید:
کاتلین
val adapter = MyAdapter(items, viewModel.retrieveState())
جاوا
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
۴. بازیابی وضعیت آیتمهای لیست در ViewHolder
آداپتور
در RecyclerView.Adapter
، وقتی یک ViewHolder
به یک آیتم متصل میکنید، وضعیت آیتم را بازیابی کنید:
کاتلین
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) } }
جاوا
@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
: حالت (state) یک فعالیت یا قطعه کد را نگهداری میکند.
مجموعههایی که حاوی این راهنما هستند
این راهنما بخشی از این مجموعههای راهنمای سریعِ برگزیده است که اهداف گستردهتر توسعه اندروید را پوشش میدهد:

بهینه سازی برای صفحه نمایش های بزرگ
سوالی یا بازخوردی دارید؟
RecyclerView
میتواند حجم زیادی از دادهها را با استفاده از حداقل منابع گرافیکی نمایش دهد. همانطور که کاربران در RecyclerView
در حال پیمایش آیتمها هستند، نمونههای View
از آیتمهایی که از صفحه خارج شدهاند، هنگام پیمایش روی صفحه، برای ایجاد آیتمهای جدید دوباره استفاده میشوند. اما تغییرات پیکربندی، مانند چرخش دستگاه، میتواند وضعیت RecyclerView
را مجدداً تنظیم کند و کاربران را مجبور کند دوباره به موقعیت قبلی خود در لیست آیتمها پیمایش کنند.
RecyclerView
باید وضعیت خود - به ویژه موقعیت اسکرول - و وضعیت عناصر لیست خود را در طول تمام تغییرات پیکربندی حفظ کند.
نتایج
RecyclerView
شما قادر است موقعیت اسکرول خود و وضعیت هر آیتم در لیست RecyclerView
را بازیابی کند.
حفظ حالت
سیاست بازیابی وضعیت RecyclerView.Adapter
را طوری تنظیم کنید که موقعیت اسکرول RecyclerView
ذخیره کند. وضعیت آیتمهای لیست RecyclerView
را ذخیره کند. وضعیت آیتمهای لیست را به آداپتور RecyclerView
اضافه کند و وضعیت آیتمهای لیست را هنگامی که به یک ViewHolder
متصل میشوند، بازیابی کند.
۱. فعال کردن سیاست بازیابی وضعیت Adapter
سیاست بازیابی وضعیت آداپتور RecyclerView
را فعال کنید تا موقعیت پیمایش RecyclerView
در طول تغییرات پیکربندی حفظ شود. مشخصات سیاست را به سازنده آداپتور اضافه کنید:
کاتلین
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
جاوا
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
۲. ذخیره وضعیت آیتمهای لیست با وضعیت
وضعیت آیتمهای پیچیدهی لیست RecyclerView
، مانند آیتمهایی که حاوی عناصر EditText
هستند را ذخیره کنید. برای مثال، برای ذخیرهی وضعیت یک EditText
، یک تابع فراخوانی مشابه با onClick
handler برای ثبت تغییرات متن اضافه کنید. درون این تابع فراخوانی، دادههایی که باید ذخیره شوند را تعریف کنید:
کاتلین
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
جاوا
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
تابع فراخوانی (callback) را در Activity
یا Fragment
خود تعریف کنید. از ViewModel
برای ذخیره حالت (state) استفاده کنید.
۳. اضافه کردن وضعیت آیتم لیست به Adapter
وضعیت آیتمهای لیست را به RecyclerView.Adapter
خود اضافه کنید. وضعیت آیتم را هنگام ایجاد Activity
یا Fragment
میزبان به سازنده آداپتور ارسال کنید:
کاتلین
val adapter = MyAdapter(items, viewModel.retrieveState())
جاوا
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
۴. بازیابی وضعیت آیتمهای لیست در ViewHolder
آداپتور
در RecyclerView.Adapter
، وقتی یک ViewHolder
به یک آیتم متصل میکنید، وضعیت آیتم را بازیابی کنید:
کاتلین
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) } }
جاوا
@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
: حالت (state) یک فعالیت یا قطعه کد را نگهداری میکند.
مجموعههایی که حاوی این راهنما هستند
این راهنما بخشی از این مجموعههای راهنمای سریعِ برگزیده است که اهداف گستردهتر توسعه اندروید را پوشش میدهد:
