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

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) یک فعالیت یا قطعه کد را نگهداری می‌کند.

مجموعه‌هایی که حاوی این راهنما هستند

این راهنما بخشی از این مجموعه‌های راهنمای سریعِ برگزیده است که اهداف گسترده‌تر توسعه اندروید را پوشش می‌دهد:

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

سوالی یا بازخوردی دارید؟

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

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) یک فعالیت یا قطعه کد را نگهداری می‌کند.

مجموعه‌هایی که حاوی این راهنما هستند

این راهنما بخشی از این مجموعه‌های راهنمای سریعِ برگزیده است که اهداف گسترده‌تر توسعه اندروید را پوشش می‌دهد:

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

سوالی یا بازخوردی دارید؟

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