چند سالی میشه که برنامه نویسی اندروید رو شروع کردم. یکی از چیز هایی که توی هر برنامه اندرویدی وجود داره، لیست ها هستند. اون اوایل برای نمایش لیست ها باید از ListView و GridView استفاده میکردیم. بعدش گوگل با support library یه روش جدید رو معرفی کرد که استفاده از RecyclerView ها بود. اما چیزی که تو هر دوی این روش ها تغییر نکرد استفاده از اداپتور ها بود. من از همون اول با استفاده کردن از اداپتور ها مشکل داشتم و هرچی که گذشت و بیشتر توی برنامه نویسی اندروید غرق شدم. بیشتر به فکر یک روش دیگه برای نمایش لیست هام بودم.
هر بار برای نمایش یک لیست باید یک کلاس جدید میساختم. توش اداپتور RecyclerView رو پیاده سازی میکردم و کلی کد boilerplate رو که دیگه برای نوشتنشون به ذره ای فکر کردن نیاز نداشتم رو مینوشتم. این کار توی هر پروژه که میگذشت بیشتر اعصابم رو خورد میکرد.
این شد که یک کتابخونه نوشتم برای نمایش لیست ها که دیگه لازم نیست یک کلاس دیگه ساخته بشه و کلی از چیز هایی که برای یک لیست میخواستم رو توش قرار دادم. این کتابخونه با کاتلین dsl نوشته شده و کار من رو خیلی راحت تر کرده.
Example 1 - vertical list
recyclerView.simple(items) { // call this function on your recycle view and put your dataset columns = 1 // a list with one column and many rows itemMargin(8) // margin for every items (dp) padding(8) // padding of recyclerView (dp) clipToPadding = false // set a header on top of list view that will scroll with other items headerBind(R.layout.header_view) { // bind header view with dataset // will run iside onBindViewHolder of header } // set a item layout and bind your dataset with it itemHolder(R.layout.item_view_v) { // will run inside item viewholder itemView.button.setOnClickListener { // on click } bind { view, item, position -> // bind item view with dataset // will run inside onBindViewHolder of item } } // set a footer at bottom of list view that will scroll with other items footerBind(R.layout.footer_view) { v -> // bind footer view with dataset // will run iside onBindViewHolder of footer } }
Example 2 - horizontal list
recyclerView.simple(items) { rows = 1 // a list with one row and many columns itemMargin(8) padding(8) clipToPadding = false itemHolder(R.layout.item_view_g) { itemView.updateLayoutParams { width = 170 * density } itemView.setOnClickListener { // on click } bind { v, item, _ -> // bind item view } } }
Example 3 - vertical/horizontal grid
recyclerView.simple(items) { columns = 2 // a grid with 2 columns and many rows // or rows = 2 // a grid with 2 rows and many columns itemMargin(8) padding(8) clipToPadding = false headerBind(R.layout.header_view) { // bind header view } itemHolder(R.layout.item_view_g) { bind { v, item, _ -> // bind item view } } }
Example 4 - view pager
recyclerView.simple(items) { rows = 1 enablePagerSnap = true // list will act like a view pager itemBind(R.layout.item_view_p) { v, item, _ -> // bind item view } }
Example 5 - swipe menu
recyclerView.simple(items) { columns = 1 itemMargin(8) padding(8) clipToPadding = false clipChildren = false itemHolder(R.layout.item_view_h, R.layout.menu_view_h) { // first input is item layout and second one is swipe menu layout bind { v, item, _ -> // bind item view } swipeView?.also { v -> v.btnDelete.setOnClickListener { adapter.removeItem(adapterPosition) } v.btnMessage.setOnClickListener { // on click } } } }