وضعیت RecyclerView را مدیریت کنید

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 گسترده‌تری را پوشش می‌دهد:

برنامه خود را فعال کنید تا از تجربه کاربری بهینه شده در رایانه لوحی، دستگاه‌های تاشو و دستگاه‌های ChromeOS پشتیبانی کند.

سوال یا بازخورد داشته باشید

به صفحه سوالات متداول ما بروید و درباره راهنماهای سریع بیاموزید یا با ما تماس بگیرید و نظرات خود را با ما در میان بگذارید.