RecyclerView
می تواند حجم زیادی از داده ها را با استفاده از حداقل منابع گرافیکی نمایش دهد. هنگامی که کاربران در میان موارد موجود در RecyclerView
پیمایش میکنند، نمونههایی از مواردی View
که از صفحه خارج شدهاند، برای ایجاد موارد جدید در حین پیمایش روی صفحه، دوباره استفاده میشوند. اما تغییرات پیکربندی، مانند چرخش دستگاه، میتواند وضعیت RecyclerView
را بازنشانی کند و کاربران را مجبور کند دوباره به موقعیت قبلی خود در لیست موارد پیمایش کنند.
RecyclerView
باید وضعیت خود - به ویژه موقعیت اسکرول - و وضعیت عناصر لیست خود را در طول تمام تغییرات پیکربندی حفظ کند.
حالت را حفظ کند
سیاست بازیابی حالت RecyclerView.Adapter
را برای ذخیره موقعیت اسکرول RecyclerView
تنظیم کنید. وضعیت موارد لیست RecyclerView
را ذخیره کنید. وضعیت آیتم های لیست را به آداپتور RecyclerView
اضافه کنید و هنگامی که آیتم های لیست به ViewHolder
متصل می شوند وضعیت را بازیابی کنید.
1. سیاست بازیابی حالت 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); } ... }
2. وضعیت آیتم های لیست حالت دار را ذخیره کنید
وضعیت موارد پیچیده لیست RecyclerView
ذخیره کنید، مانند مواردی که حاوی عناصر EditText
هستند. به عنوان مثال، برای ذخیره وضعیت یک EditText
، یک پاسخ تماس مشابه با کنترل کننده onClick
اضافه کنید تا تغییرات متن را ثبت کنید. در پاسخ به تماس، تعریف کنید که چه دادههایی ذخیره شوند:
کاتلین
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
جاوا
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
پاسخ تماس را در Activity
یا Fragment
خود اعلام کنید. از ViewModel
برای ذخیره وضعیت استفاده کنید.
3. وضعیت مورد لیست را به Adapter
اضافه کنید
وضعیت موارد لیست را به RecyclerView.Adapter
خود اضافه کنید. هنگامی که Activity
یا Fragment
میزبان شما ایجاد می شود، وضعیت مورد را به سازنده آداپتور منتقل کنید:
کاتلین
val adapter = MyAdapter(items, viewModel.retrieveState())
جاوا
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. وضعیت مورد لیست را در 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
: حالت را برای یک فعالیت یا قطعه نگه می دارد.
نتایج
RecyclerView
شما اکنون می تواند موقعیت اسکرول خود و وضعیت هر مورد در لیست RecyclerView
را بازیابی کند.
مجموعه هایی که حاوی این راهنما هستند
این راهنما بخشی از مجموعههای راهنمای Quick Guide است که اهداف توسعه Android گستردهتری را پوشش میدهد: