سفارشیسازی یک لیست پویا بخشی از Android Jetpack .
شما میتوانید اشیاء RecyclerView برای برآورده کردن نیازهای خاص خود سفارشی کنید. کلاسهای استاندارد شرح داده شده در «ایجاد لیستهای پویا با RecyclerView» تمام عملکردهایی را که اکثر توسعهدهندگان به آن نیاز دارند، ارائه میدهند. در بسیاری از موارد، شما فقط باید نمای هر نگهدارنده نما را طراحی کنید و کدی را برای بهروزرسانی آن نماها با دادههای مناسب بنویسید. با این حال، اگر برنامه شما الزامات خاصی دارد، میتوانید رفتار استاندارد را به روشهای مختلفی تغییر دهید. این سند برخی از سفارشیسازیهای ممکن را شرح میدهد.
طرحبندی را اصلاح کنید
RecyclerView از یک مدیر طرحبندی برای قرار دادن آیتمهای منفرد روی صفحه و تعیین زمان استفاده مجدد از نماهای آیتم که دیگر برای کاربر قابل مشاهده نیستند، استفاده میکند. برای استفاده مجدد یا بازیافت یک نما، یک مدیر طرحبندی ممکن است از آداپتور بخواهد که محتوای نما را با عنصر متفاوتی از مجموعه داده جایگزین کند. بازیافت نماها به این روش با جلوگیری از ایجاد نماهای غیرضروری یا انجام جستجوهای پرهزینه findViewById() عملکرد را بهبود میبخشد. کتابخانه پشتیبانی اندروید شامل سه مدیر طرحبندی استاندارد است که هر کدام گزینههای سفارشیسازی زیادی را ارائه میدهند:
-
LinearLayoutManager: آیتمها را در یک لیست تکبعدی مرتب میکند. استفاده ازRecyclerViewبه همراهLinearLayoutManagerعملکردی مانند طرحبندیListViewرا فراهم میکند. -
GridLayoutManager: آیتمها را در یک شبکه دوبعدی، مانند مربعهای روی صفحه شطرنجی، مرتب میکند. استفاده ازRecyclerViewبه همراهGridLayoutManagerعملکردی مانند طرحبندیGridViewرا فراهم میکند. -
StaggeredGridLayoutManager: آیتمها را در یک شبکه دوبعدی مرتب میکند، به طوری که هر ستون نسبت به ستون قبلی کمی انحراف دارد، مانند ستارههای روی پرچم آمریکا.
اگر این مدیران طرحبندی نیازهای شما را برآورده نمیکنند، میتوانید با بسط دادن کلاس انتزاعی RecyclerView.LayoutManager مورد دلخواه خود را ایجاد کنید.
اضافه کردن انیمیشنهای آیتم
هر زمان که یک آیتم تغییر میکند، RecyclerView از یک انیماتور برای تغییر ظاهر آن استفاده میکند. این انیماتور شیءای است که از کلاس انتزاعی RecyclerView.ItemAnimator ارثبری میکند. به طور پیشفرض، RecyclerView از DefaultItemAnimator برای ارائه انیمیشن استفاده میکند. اگر میخواهید انیمیشنهای سفارشی ارائه دهید، میتوانید شیء انیماتور خود را با ارثبری RecyclerView.ItemAnimator تعریف کنید.
فعال کردن انتخاب بر اساس لیست آیتمها
کتابخانه recyclerview-selection به کاربران اجازه میدهد تا آیتمها را در یک لیست RecyclerView با استفاده از ورودی لمسی یا ماوس انتخاب کنند. این به شما امکان میدهد تا کنترل نمایش بصری یک آیتم انتخاب شده را حفظ کنید. همچنین میتوانید کنترل سیاستهای کنترل رفتار انتخاب، مانند اینکه کدام آیتمها واجد شرایط انتخاب هستند و چند آیتم میتوانند انتخاب شوند، را در دست داشته باشید.
برای افزودن پشتیبانی از انتخاب به یک نمونه RecyclerView ، مراحل زیر را دنبال کنید:
- مشخص کنید که از کدام نوع کلید انتخاب استفاده کنید، سپس یک
ItemKeyProviderبسازید.سه نوع کلید وجود دارد که میتوانید برای شناسایی موارد انتخاب شده استفاده کنید:
-
Parcelableو زیرکلاسهای آن، مانندUri -
String -
Long
برای اطلاعات دقیق در مورد انواع کلید انتخاب، به
SelectionTracker.Builderمراجعه کنید. -
-
ItemDetailsLookupپیادهسازی کنید. - اشیاء item
Viewرا درRecyclerViewبهروزرسانی کنید تا مشخص شود که آیا کاربر آنها را انتخاب کرده یا از حالت انتخاب خارج کرده است.کتابخانه انتخاب، تزئینات بصری پیشفرضی برای آیتمهای انتخابشده ارائه نمیدهد. هنگام پیادهسازی
onBindViewHolder()این مورد را ارائه دهید. ما رویکرد زیر را توصیه میکنیم:- در
onBindViewHolder()، متدsetActivated()فراخوانی کنید — نهsetSelected()و این کار را روی شیءViewباtrueیاfalseانجام دهید، بسته به اینکه آیا آیتم انتخاب شده است یا خیر. - استایلبندی نما را بهروزرسانی کنید تا وضعیت فعالشده را نمایش دهد. توصیه میکنیم برای پیکربندی استایلبندی از یک منبع لیست وضعیت رنگی استفاده کنید.
- در
- از
ActionModeبرای ارائه ابزارهایی به کاربر جهت انجام یک عمل روی انتخاب استفاده کنید. - هرگونه اقدام ثانویه تفسیر شده را انجام دهید.
- همه چیز را با
SelectionTracker.Builderمونتاژ کنید. - انتخاب را در رویدادهای چرخه حیات فعالیت لحاظ کنید.
ItemDetailsLookup به کتابخانه انتخاب اجازه میدهد تا به اطلاعات مربوط به آیتمهای RecyclerView با توجه به MotionEvent دسترسی پیدا کند. این در واقع یک کارخانه برای نمونههای ItemDetails است که توسط یک نمونه RecyclerView.ViewHolder پشتیبانگیری یا از آن استخراج میشوند.
یک SelectionTracker.SelectionObserver ثبت کنید تا هنگام تغییر یک انتخاب، مطلع شود. وقتی یک انتخاب برای اولین بار ایجاد میشود، ActionMode اجرا کنید تا این را به کاربر ارائه دهد و اقدامات خاص انتخاب را ارائه دهد. به عنوان مثال، میتوانید یک دکمه حذف به نوار ActionMode اضافه کنید و فلش برگشت روی نوار را به هم وصل کنید تا انتخاب پاک شود. وقتی انتخاب خالی شد - اگر کاربر آخرین بار انتخاب را پاک کرده باشد - حالت عمل را خاتمه دهید.
در پایان خط پردازش رویداد، کتابخانه ممکن است تشخیص دهد که کاربر در تلاش است تا با ضربه زدن روی یک آیتم، آن را فعال کند، یا در تلاش است تا یک آیتم یا مجموعهای از آیتمهای انتخاب شده را بکشد. با ثبت شنونده مناسب، به این تفاسیر واکنش نشان میدهد. برای اطلاعات بیشتر، به SelectionTracker.Builder مراجعه کنید.
مثال زیر نحوه کنار هم قرار دادن این قطعات را نشان میدهد:
کاتلین
var tracker = SelectionTracker.Builder( "my-selection-id", recyclerView, StableIdKeyProvider(recyclerView), MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build()
جاوا
SelectionTracker tracker = new SelectionTracker.Builder<>( "my-selection-id", recyclerView, new StableIdKeyProvider(recyclerView), new MyDetailsLookup(recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener(myItemActivatedListener) .build();
برای ساخت یک نمونه SelectionTracker ، برنامه شما باید همان RecyclerView.Adapter را که برای مقداردهی اولیه RecyclerView به SelectionTracker.Builder استفاده میکنید، ارائه دهد. به همین دلیل، پس از ایجاد نمونه SelectionTracker ، آن را به RecyclerView.Adapter خود تزریق کنید. در غیر این صورت، نمیتوانید وضعیت انتخاب شدن یک آیتم را از متد onBindViewHolder() بررسی کنید.
برای حفظ وضعیت انتخاب در طول رویدادهای چرخه حیات اکتیویتی، برنامه شما باید متدهای onSaveInstanceState() و onRestoreInstanceState() به ردیاب انتخاب را به ترتیب از متدهای onSaveInstanceState() و onRestoreInstanceState() مربوط به اکتیویتی فراخوانی کند. برنامه شما همچنین باید یک شناسه انتخاب منحصر به فرد به سازنده SelectionTracker.Builder ارائه دهد. این شناسه مورد نیاز است زیرا یک اکتیویتی یا یک فرگمنت ممکن است بیش از یک لیست قابل انتخاب مجزا داشته باشد که همه آنها باید در وضعیت ذخیره شده خود باقی بمانند.
منابع اضافی
برای اطلاعات تکمیلی به مراجع زیر مراجعه کنید.
- برنامه نمایشی آفتابگردان ، که از
RecyclerViewاستفاده میکند. - از RecyclerView برای نمایش یک لیست قابل اسکرول در codelab استفاده کنید .
- اصول اولیه کاتلین اندروید: مبانی RecyclerView در codelab.
