修改AdapterDelegates開源項目
開源項目地址:https://github.com/sockeqwe/AdapterDelegates
發現該開源項目擴展性似乎有點差,裏面沒有可以擴展的接口。有點搞不下去了。於是有了重構的想法了,這種想法是不是太邪惡了?
該項目的設計原理是,每種類型的視圖對應一種代理,對adapter起到很好的解耦效果。不管是代碼管理還是視圖結構都清晰明瞭。該項目精簡,幾個類就解決問題,如果只有簡單的需要沒必要引入複雜的adapter封裝包。
所做修改
- 提取抽象類IDelegate、IDelegateManager,使得項目擴展性更好。
- 遵守開閉原則,新增了IbbListDelegateAdapter類,用於添加itemClick itemLongClick事件。
Dependencies
This library is available on maven central:
compile 'com.ibbhub.android:adapterdelegate:1.0.0'
使用說明
viewType ==1的情況
當視圖的類型只有一種的時候,我們的adapter需要繼承IbbListDelegateAdapter,該類傳入一個List<?>數據。在構造方法裏面添加列表視圖的代理就行,只有一種視圖的時候我們添加AbsFallbackAdapterDelegate的代理類型即可。
IbbListDelegateAdapter
public class ReptilesAdapter extends IbbListDelegateAdapter<List<DisplayableItem>> {
public ReptilesAdapter(List<DisplayableItem> items) {
// Delegates
this.delegatesManager.setFallbackDelegate(new ReptilesFallbackDelegate());
setItems(items);
}
}
AbsFallbackAdapterDelegate:該代理爲默認代理,避免用戶設置視圖類型的時候出現沒有代理對應的情況。如果只有一種視圖類型,建議使用該代理,因爲該代理默認添加了視圖的點擊和長按事件。
public class ReptilesFallbackDelegate extends AbsFallbackAdapterDelegate<List<DisplayableItem>> {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent) {
View view = inflater.inflate(R.layout.item_unknown_reptile, parent, false);
return new ReptileFallbackViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull List<DisplayableItem> items, int position, @NonNull RecyclerView.ViewHolder holder, @NonNull List<Object> payloads) {
super.onBindViewHolder(items, position, holder, payloads);
}
class ReptileFallbackViewHolder extends RecyclerView.ViewHolder {
public ReptileFallbackViewHolder(View itemView) {
super(itemView);
}
}
}
設置itemClick:如果想設置item的點擊事件和長按事件,設置監聽事件即可。
//remember,The adapter must extends AbsFallbackAdapterDelegate and @Override
//public void onBindViewHolder()
adapter.setListener(new AdapterListener<List<DisplayableItem>>() {
@Override
public void onClick(List<DisplayableItem> displayableItems, int pos) {
Toast.makeText(ReptilesActivity.this, "click-->pos:"+pos, Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(List<DisplayableItem> displayableItems, int pos) {
Toast.makeText(ReptilesActivity.this, "long click-->pos:"+pos, Toast.LENGTH_SHORT).show();
}
});
2.viewType >1的情況
**ListDelegationAdapter **:如果視圖類型爲多種,則需要繼承ListDelegationAdapter,利用delegatesManager添加多種代理。在Delegate當中設置是否爲顯示的類型,如果該類型沒有代理對應,則顯示默認代理的視圖。
public class AnimalAdapter extends ListDelegationAdapter<List<Animal>> {
public AnimalAdapter(Activity activity, List<Animal> items) {
// DelegatesManager is a protected Field in ListDelegationAdapter
delegatesManager.addDelegate(new CatAdapterDelegate(activity))
.addDelegate(new DogAdapterDelegate(activity))
.addDelegate(new GeckoAdapterDelegate(activity))
.addDelegate(23, new SnakeAdapterDelegate(activity));
// Set the items from super class.
setItems(items);
}
}
**AdapterDelegate **:如果視圖的類型爲多種,則繼承該類。
public class CatAdapterDelegate extends AdapterDelegate<List<Animal>> {
private LayoutInflater inflater;
public CatAdapterDelegate(Activity activity) {
inflater = activity.getLayoutInflater();
}
@Override public boolean isForViewType(@NonNull List<Animal> items, int position) {
return items.get(position) instanceof Cat;
}
@NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
return new CatViewHolder(inflater.inflate(R.layout.item_cat, parent, false));
}
@Override public void onBindViewHolder(@NonNull List<Animal> items, int position,
@NonNull RecyclerView.ViewHolder holder, @Nullable List<Object> payloads) {
CatViewHolder vh = (CatViewHolder) holder;
Cat cat = (Cat) items.get(position);
vh.name.setText(cat.getName());
}
static class CatViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public CatViewHolder(View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.name);
}
}
}