天天看點

Android 通用擴充卡,RecyclerView修改AdapterDelegates開源項目

修改AdapterDelegates開源項目

開源項目位址:https://github.com/sockeqwe/AdapterDelegates

發現該開源項目擴充性似乎有點差,裡面沒有可以擴充的接口。有點搞不下去了。于是有了重構的想法了,這種想法是不是太邪惡了?

該項目的設計原理是,每種類型的視圖對應一種代理,對adapter起到很好的解耦效果。不管是代碼管理還是視圖結構都清晰明了。該項目精簡,幾個類就解決問題,如果隻有簡單的需要沒必要引入複雜的adapter封裝包。

所做修改

  1. 提取抽象類IDelegate、IDelegateManager,使得項目擴充性更好。
  2. 遵守開閉原則,新增了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);
    }
  }
}
           

繼續閱讀