Modular adapter for Android RecyclerView.
DO NOT USE THIS LIBRARY IN PRODUCTION UNTIL V1.0.0 IS RELEASED.
Add the following dependency to your build.gradle file:
dependencies {
// required, core
implementation 'com.samelody.modapter:modapter-core:0.2.0'// optional, support android paging library
implementation 'com.samelody.modapter:modapter-paging:0.2.0'
}// create a ModularAdapter object instead of creating new Subclass of RecyclerView.Adapter.ModularAdapter<AdapterItem> adapter = newModularAdapter<>();
listView.setAdapter(adapter);
// register item metadata to managerItemManager<AdapterItem> manager = adapter.getManager();
manager.register(R.layout.item_gallery_image, ImageViewHolder.class)
.register(R.layout.item_gallery_date, DateViewHolder.class);
// prepare data listList<Item> list = newArrayList<>();
list.add(newImageItem());
list.add(newDateItem());
// submit listmanager.submitList(list);
// notify adapter if no async differs usedadapter.notifyDataSetChanged();The ItemManager not enable async diffing by default.
You can setup AsyncDiffer by your choice. The setting API is ItemManager#setDiffer().
The implemented async differs are following:
NonAsyncDiffer: The non implementation. (default used)ListAsyncDiffer: TheAsyncListDifferimplementation.PagedAsyncDiffer: TheAsyncPagedListDifferimplementation.
// set differmanager.setDiffer(newListAsyncDiffer<>());
// submit listmanager.submitList(list);
// not need to call adapter.notify APIsAll APIs are encapsulated in ItemManager interface returned by ModularAdapter#getManager().
// register via layoutId and holderClassItemManager<E> register(@LayoutResintlayoutId, Class<T> holderClass);
// register via ItemMetadataItemManager<E> register(ItemMetadatametadata);
// unregister via layoutIdItemManager<E> unregister(@LayoutResintlayoutId);
// setup the data listItemManager<E> submitList(List<? extendsE> list);
// Gets the item with given positionEgetItem(intposition);
// Gets current displayed listList<E> getCurrentList();
// Gets item countintgetItemCount();
// setup async differItemManager<E> setDiffer(AsyncDiffer<E> differ);We have one ViewHolder called BannerImageViewHolder shows ImageItem as a banner image, another ViewHolder called GridImageViewHolder shows ImageItem as a gallery image in a grid.
publicclassImageItemimplementsAdapterItem { /*...*/ }
publicclassBannerImageViewHolderextendsItemViewHolder<ImageItem> { /*...*/ }
publicclassGridImageViewHolderextendsItemViewHolder<ImageItem> { /*...*/ }Register the item metadatas.
adapter.getManager()
.register(R.layout.item_image_banner, BannerImageViewHolder.class)
.register(R.layout.item_image_grid, GridImageViewHolder.class);By changing the ImageItem's layoutId to reuse itself.
imageItem.setLayoutId(R.layout.item_image_banner);
// or imageItem.setLayoutId(R.layout.item_image_grid);We have a ad item view display as a card called AdViewHolder. It display a image and a title. We also have two adapter items called MusicItem and PlaylistItem.
Define AdItem interface as abstraction for MusicItem and PlaylistItem, used with AdViewHolder.
publicinterfaceAdItemextendsAdapterItem { StringgetAdImageUrl();
StringgetAdTitle();
voidonAdClicked();
}
publicclassMusicItemimplementsAdItem { /*...*/ }
publicclassPlaylistItemimplementsAdItem { /*...*/ }
publicclassAdViewHolderextendsItemViewHolder<AdItem> { /*...*/ }Now, AdViewHolder be reused, and the onAdClicked()'s behavior determined by the AdItem, it implements the Data-Driven-Development.
Copyright 2019 Samelody.com
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.