From c40b8c9c6823c2256cf2d548eca23bee969242f6 Mon Sep 17 00:00:00 2001 From: chaychan <844738237@qq.com> Date: Wed, 11 Apr 2018 17:36:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?BaseItemProvider=E6=96=B0=E5=A2=9E=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=B3=A8=E8=A7=A3=E6=88=96=E9=87=8D=E5=86=99=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E8=BF=94=E5=9B=9EviewType=E5=92=8Clayout=E7=9A=84id;?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DitemProvider=E8=A6=86=E7=9B=96onItemClickList?= =?UTF-8?q?ener=E5=9B=9E=E8=B0=83=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E5=A6=82=E6=9C=89=E8=AE=BE=E7=BD=AEonItemClickListener?= =?UTF-8?q?=E5=88=99=E4=B8=8D=E5=9B=9E=E8=B0=83=E5=88=B0itemProvider?= =?UTF-8?q?=E7=9A=84onClick=E6=96=B9=E6=B3=95=E4=B8=AD=EF=BC=8C=E9=95=BF?= =?UTF-8?q?=E6=8C=89=E4=BA=8B=E4=BB=B6=E5=A6=82=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/provider/TextItemProvider.java | 17 +++++++ .../adapter/base/MultipleItemRvAdapter.java | 48 ++++++++++++++----- .../base/provider/BaseItemProvider.java | 22 +++++++-- .../util/ItemProviderAnnotationException.java | 17 ------- .../adapter/base/util/ProviderDelegate.java | 6 ++- 5 files changed, 75 insertions(+), 35 deletions(-) delete mode 100644 library/src/main/java/com/chad/library/adapter/base/util/ItemProviderAnnotationException.java diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java index 8ac0a8810..f6ec63841 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java @@ -22,6 +22,23 @@ ) public class TextItemProvider extends BaseItemProvider { + /* + 使用注解返回对应的viewType和layout,或者重写getViewType()和getLayout() + Use annotations to return the corresponding viewType and layout, or override getViewType() and getLayout() + + @Override + public int getViewType() { + return DemoMultipleItemRvAdapter.TYPE_TEXT; + } + */ + + /* + @Override + public int getLayout() { + return R.layout.item_text_view; + } + */ + @Override public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { helper.setText(R.id.tv, data.content); diff --git a/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java b/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java index bb8353835..1ac762c10 100644 --- a/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java @@ -54,7 +54,12 @@ protected int getItemType(T t) { provider.mData = mData; ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class); - getMultiTypeDelegate().registerItemType(key, tag.layout()); + if (tag == null){ + getMultiTypeDelegate().registerItemType(key, provider.getLayout()); + }else{ + getMultiTypeDelegate().registerItemType(key, tag.layout()); + } + } } @@ -76,20 +81,37 @@ protected void convert(V helper, T item) { } private void bindClick(final V helper, final T item, final int position, final BaseItemProvider provider) { + OnItemClickListener clickListener = getOnItemClickListener(); + OnItemLongClickListener longClickListener = getOnItemLongClickListener(); + + if (clickListener != null && longClickListener != null){ + //如果已经设置了子条目点击监听和子条目长按监听 + // If you have set up a sub-entry click monitor and sub-entries long press listen + return; + } + View itemView = helper.itemView; - itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - provider.onClick(helper, item, position); - } - }); + if (clickListener == null){ + //如果没有设置点击监听,则回调给itemProvider + //Callback to itemProvider if no click listener is set + itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + provider.onClick(helper, item, position); + } + }); + } - itemView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - return provider.onLongClick(helper, item, position); - } - }); + if (longClickListener == null){ + //如果没有设置长按监听,则回调给itemProvider + // If you do not set a long press listener, callback to the itemProvider + itemView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + return provider.onLongClick(helper, item, position); + } + }); + } } } diff --git a/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java b/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java index c045eb1eb..efe4e680d 100644 --- a/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java +++ b/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java @@ -20,7 +20,23 @@ public abstract class BaseItemProvider { public abstract void convert(V helper, T data, int position); - public abstract void onClick(V helper, T data, int position); - - public abstract boolean onLongClick(V helper, T data, int position); + //子类若想实现条目点击事件则重写该方法 + //Subclasses override this method if you want to implement an item click event + public void onClick(V helper, T data, int position){}; + + //子类若想实现条目长按事件则重写该方法 + //Subclasses override this method if you want to implement an item long press event + public boolean onLongClick(V helper, T data, int position){return false;}; + + //如果没有使用注解返回layout则重写该方法 + //Rewrite this method if you did not use annotations to return layout + public int getLayout(){ + return 0; + } + + //如果没有使用注解返回viewType则重写该方法 + //Rewrite this method if you did not use annotations to return viewType + public int getViewType(){ + return 0; + } } diff --git a/library/src/main/java/com/chad/library/adapter/base/util/ItemProviderAnnotationException.java b/library/src/main/java/com/chad/library/adapter/base/util/ItemProviderAnnotationException.java deleted file mode 100644 index 0142e2d6d..000000000 --- a/library/src/main/java/com/chad/library/adapter/base/util/ItemProviderAnnotationException.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.chad.library.adapter.base.util; - -/** - * https://github.com/chaychan - * - * @author ChayChan - * @description: AnnotationException - * @date 2018/3/30 17:07 - */ - -public class ItemProviderAnnotationException extends RuntimeException { - - public ItemProviderAnnotationException(String message) { - super(message); - } - -} diff --git a/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java b/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java index b694f6bbe..5dd94d853 100644 --- a/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java +++ b/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java @@ -17,11 +17,13 @@ public class ProviderDelegate { public void registerProvider(BaseItemProvider provider){ ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class); + int viewType; if (tag == null){ - throw new ItemProviderAnnotationException("ItemProviderTag not def layout"); + viewType = provider.getViewType(); + }else{ + viewType = tag.viewType(); } - int viewType = tag.viewType(); if (mItemProviders.get(viewType) == null){ mItemProviders.put(viewType,provider); } From 66ca0bd76b746cfe545e89434a1a0ad9992cfb3f Mon Sep 17 00:00:00 2001 From: chaychan <844738237@qq.com> Date: Thu, 12 Apr 2018 09:24:17 +0800 Subject: [PATCH 2/2] 1.Deprecated interface ItemProvideTag; 2.Replace reflections with native method; 3.Improve item click event handling --- .../adapter/provider/ImgItemProvider.java | 15 +++++--- .../adapter/provider/TextImgItemProvider.java | 16 +++++---- .../adapter/provider/TextItemProvider.java | 35 +++++++------------ .../adapter/base/MultipleItemRvAdapter.java | 12 ++----- .../base/annotation/ItemProviderTag.java | 1 + .../base/provider/BaseItemProvider.java | 20 +++++------ .../base/util/ItemProviderException.java | 15 ++++++++ .../adapter/base/util/ProviderDelegate.java | 11 +++--- 8 files changed, 62 insertions(+), 63 deletions(-) create mode 100644 library/src/main/java/com/chad/library/adapter/base/util/ItemProviderException.java diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/ImgItemProvider.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/ImgItemProvider.java index 09166ffe8..6a719ea8c 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/ImgItemProvider.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/ImgItemProvider.java @@ -6,7 +6,6 @@ import com.chad.baserecyclerviewadapterhelper.adapter.DemoMultipleItemRvAdapter; import com.chad.baserecyclerviewadapterhelper.entity.NormalMultipleEntity; import com.chad.library.adapter.base.BaseViewHolder; -import com.chad.library.adapter.base.annotation.ItemProviderTag; import com.chad.library.adapter.base.provider.BaseItemProvider; /** @@ -17,12 +16,18 @@ * @date 2018/3/30 11:39 */ -@ItemProviderTag( - viewType = DemoMultipleItemRvAdapter.TYPE_IMG, - layout = R.layout.item_image_view -) public class ImgItemProvider extends BaseItemProvider { + @Override + public int viewType() { + return DemoMultipleItemRvAdapter.TYPE_IMG; + } + + @Override + public int layout() { + return R.layout.item_image_view; + } + @Override public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { if (position % 2 == 0) { diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextImgItemProvider.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextImgItemProvider.java index b27e673b1..d5d87227e 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextImgItemProvider.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextImgItemProvider.java @@ -6,7 +6,6 @@ import com.chad.baserecyclerviewadapterhelper.adapter.DemoMultipleItemRvAdapter; import com.chad.baserecyclerviewadapterhelper.entity.NormalMultipleEntity; import com.chad.library.adapter.base.BaseViewHolder; -import com.chad.library.adapter.base.annotation.ItemProviderTag; import com.chad.library.adapter.base.provider.BaseItemProvider; /** @@ -15,13 +14,18 @@ * @description: Text Img ItemProvider * @date 2018/3/30 11:39 */ - -@ItemProviderTag( - viewType = DemoMultipleItemRvAdapter.TYPE_TEXT_IMG, - layout = R.layout.item_img_text_view -) public class TextImgItemProvider extends BaseItemProvider { + @Override + public int viewType() { + return DemoMultipleItemRvAdapter.TYPE_TEXT_IMG; + } + + @Override + public int layout() { + return R.layout.item_img_text_view; + } + @Override public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { helper.setText(R.id.tv, data.content); diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java index f6ec63841..86b1c7061 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java @@ -6,38 +6,27 @@ import com.chad.baserecyclerviewadapterhelper.adapter.DemoMultipleItemRvAdapter; import com.chad.baserecyclerviewadapterhelper.entity.NormalMultipleEntity; import com.chad.library.adapter.base.BaseViewHolder; -import com.chad.library.adapter.base.annotation.ItemProviderTag; import com.chad.library.adapter.base.provider.BaseItemProvider; /** * https://github.com/chaychan + * * @author ChayChan * @description: Text ItemProvider * @date 2018/3/30 11:39 */ -@ItemProviderTag( - viewType = DemoMultipleItemRvAdapter.TYPE_TEXT, - layout = R.layout.item_text_view -) -public class TextItemProvider extends BaseItemProvider { - - /* - 使用注解返回对应的viewType和layout,或者重写getViewType()和getLayout() - Use annotations to return the corresponding viewType and layout, or override getViewType() and getLayout() - - @Override - public int getViewType() { - return DemoMultipleItemRvAdapter.TYPE_TEXT; - } - */ - - /* - @Override - public int getLayout() { - return R.layout.item_text_view; - } - */ +public class TextItemProvider extends BaseItemProvider { + + @Override + public int viewType() { + return DemoMultipleItemRvAdapter.TYPE_TEXT; + } + + @Override + public int layout() { + return R.layout.item_text_view; + } @Override public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { diff --git a/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java b/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java index 1ac762c10..5fc69f54c 100644 --- a/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java @@ -4,7 +4,6 @@ import android.util.SparseArray; import android.view.View; -import com.chad.library.adapter.base.annotation.ItemProviderTag; import com.chad.library.adapter.base.provider.BaseItemProvider; import com.chad.library.adapter.base.util.MultiTypeDelegate; import com.chad.library.adapter.base.util.ProviderDelegate; @@ -47,19 +46,12 @@ protected int getItemType(T t) { registerItemProvider(); mItemProviders = mProviderDelegate.getItemProviders(); + for (int i = 0; i < mItemProviders.size(); i++) { int key = mItemProviders.keyAt(i); - BaseItemProvider provider = mItemProviders.get(key); provider.mData = mData; - - ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class); - if (tag == null){ - getMultiTypeDelegate().registerItemType(key, provider.getLayout()); - }else{ - getMultiTypeDelegate().registerItemType(key, tag.layout()); - } - + getMultiTypeDelegate().registerItemType(key, provider.layout()); } } diff --git a/library/src/main/java/com/chad/library/adapter/base/annotation/ItemProviderTag.java b/library/src/main/java/com/chad/library/adapter/base/annotation/ItemProviderTag.java index ad62625c4..ef96556e6 100644 --- a/library/src/main/java/com/chad/library/adapter/base/annotation/ItemProviderTag.java +++ b/library/src/main/java/com/chad/library/adapter/base/annotation/ItemProviderTag.java @@ -14,6 +14,7 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) +@Deprecated public @interface ItemProviderTag { int viewType(); int layout(); diff --git a/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java b/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java index efe4e680d..50dbd985f 100644 --- a/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java +++ b/library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java @@ -18,6 +18,14 @@ public abstract class BaseItemProvider { public Context mContext; public List mData; + //子类须重写该方法返回viewType + //Rewrite this method to return viewType + public abstract int viewType(); + + //子类须重写该方法返回layout + //Rewrite this method to return layout + public abstract int layout(); + public abstract void convert(V helper, T data, int position); //子类若想实现条目点击事件则重写该方法 @@ -27,16 +35,4 @@ public abstract class BaseItemProvider { //子类若想实现条目长按事件则重写该方法 //Subclasses override this method if you want to implement an item long press event public boolean onLongClick(V helper, T data, int position){return false;}; - - //如果没有使用注解返回layout则重写该方法 - //Rewrite this method if you did not use annotations to return layout - public int getLayout(){ - return 0; - } - - //如果没有使用注解返回viewType则重写该方法 - //Rewrite this method if you did not use annotations to return viewType - public int getViewType(){ - return 0; - } } diff --git a/library/src/main/java/com/chad/library/adapter/base/util/ItemProviderException.java b/library/src/main/java/com/chad/library/adapter/base/util/ItemProviderException.java new file mode 100644 index 000000000..e1335d67e --- /dev/null +++ b/library/src/main/java/com/chad/library/adapter/base/util/ItemProviderException.java @@ -0,0 +1,15 @@ +package com.chad.library.adapter.base.util; + +/** + * @author ChayChan + * @description: ItemProviderException + * @date 2018/4/12 9:10 + */ + +public class ItemProviderException extends NullPointerException { + + public ItemProviderException(String message) { + super(message); + } + +} diff --git a/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java b/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java index 5dd94d853..f920f2321 100644 --- a/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java +++ b/library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java @@ -2,7 +2,6 @@ import android.util.SparseArray; -import com.chad.library.adapter.base.annotation.ItemProviderTag; import com.chad.library.adapter.base.provider.BaseItemProvider; /** @@ -16,14 +15,12 @@ public class ProviderDelegate { private SparseArray mItemProviders = new SparseArray<>(); public void registerProvider(BaseItemProvider provider){ - ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class); - int viewType; - if (tag == null){ - viewType = provider.getViewType(); - }else{ - viewType = tag.viewType(); + if (provider == null){ + throw new ItemProviderException("ItemProvider can not be null"); } + int viewType = provider.viewType(); + if (mItemProviders.get(viewType) == null){ mItemProviders.put(viewType,provider); }