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 e56ded91a..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,7 +16,7 @@ * @date 2018/3/30 11:39 */ -public class ImgItemProvider extends BaseItemProvider { +public class ImgItemProvider extends BaseItemProvider { @Override public int viewType() { @@ -33,9 +32,19 @@ public int layout() { public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { if (position % 2 == 0) { helper.setImageResource(R.id.iv, R.mipmap.animation_img1); - } else { + }else{ helper.setImageResource(R.id.iv, R.mipmap.animation_img2); } - helper.addOnClickListener(R.id.iv); + } + + @Override + public void onClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { + Toast.makeText(mContext, "click", Toast.LENGTH_SHORT).show(); + } + + @Override + public boolean onLongClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { + Toast.makeText(mContext, "longClick", Toast.LENGTH_SHORT).show(); + return true; } } 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 1f70bed52..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 @@ -1,5 +1,7 @@ package com.chad.baserecyclerviewadapterhelper.adapter.provider; +import android.widget.Toast; + import com.chad.baserecyclerviewadapterhelper.R; import com.chad.baserecyclerviewadapterhelper.adapter.DemoMultipleItemRvAdapter; import com.chad.baserecyclerviewadapterhelper.entity.NormalMultipleEntity; @@ -8,13 +10,11 @@ /** * https://github.com/chaychan - * * @author ChayChan * @description: Text Img ItemProvider * @date 2018/3/30 11:39 */ - -public class TextImgItemProvider extends BaseItemProvider { +public class TextImgItemProvider extends BaseItemProvider { @Override public int viewType() { @@ -31,10 +31,19 @@ public void convert(BaseViewHolder helper, NormalMultipleEntity data, int positi helper.setText(R.id.tv, data.content); if (position % 2 == 0) { helper.setImageResource(R.id.iv, R.mipmap.animation_img1); - } else { + }else{ helper.setImageResource(R.id.iv, R.mipmap.animation_img2); } - helper.addOnClickListener(R.id.tv); } + @Override + public void onClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { + Toast.makeText(mContext, "click", Toast.LENGTH_SHORT).show(); + } + + @Override + public boolean onLongClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { + Toast.makeText(mContext, "longClick", Toast.LENGTH_SHORT).show(); + return true; + } } 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 d1e91ee97..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,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; /** @@ -32,7 +31,16 @@ public int layout() { @Override public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { helper.setText(R.id.tv, data.content); - helper.addOnClickListener(R.id.tv); } + @Override + public void onClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { + Toast.makeText(mContext, "click", Toast.LENGTH_SHORT).show(); + } + + @Override + public boolean onLongClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { + Toast.makeText(mContext, "longClick", Toast.LENGTH_SHORT).show(); + return true; + } } 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 856f0960f..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; @@ -13,14 +12,14 @@ /** * https://github.com/chaychan - * * @author ChayChan - * @description: When there are multiple entries, avoid too much business logic in convert(),Put the logic of each item in the corresponding ItemProvider + * @description: + * When there are multiple entries, avoid too much business logic in convert(),Put the logic of each item in the corresponding ItemProvider * 当有多种条目的时候,避免在convert()中做太多的业务逻辑,把逻辑放在对应的ItemProvider中 * @date 2018/3/21 9:55 */ -public abstract class MultipleItemRvAdapter extends BaseQuickAdapter { +public abstract class MultipleItemRvAdapter extends BaseQuickAdapter { private SparseArray mItemProviders; protected ProviderDelegate mProviderDelegate; @@ -47,6 +46,7 @@ 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); @@ -63,8 +63,47 @@ protected int getItemType(T t) { protected void convert(V helper, T item) { int itemViewType = helper.getItemViewType(); BaseItemProvider provider = mItemProviders.get(itemViewType); + provider.mContext = helper.itemView.getContext(); + int position = helper.getLayoutPosition() - getHeaderLayoutCount(); provider.convert(helper, item, position); + + bindClick(helper, item, position, provider); + } + + 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; + + 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); + } + }); + } + + 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/annotation/ItemProviderTag.java b/library/src/main/java/com/chad/library/adapter/base/annotation/ItemProviderTag.java deleted file mode 100644 index 4ffe2356c..000000000 --- a/library/src/main/java/com/chad/library/adapter/base/annotation/ItemProviderTag.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.chad.library.adapter.base.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * https://github.com/chaychan - * - * @author ChayChan - * @description: ItemProvider's annotation - * @date 2018/3/21 10:48 - */ - -@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 a267b331d..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 @@ -8,29 +8,31 @@ /** * https://github.com/chaychan - * * @author ChayChan * @description: The base class of ItemProvider * @date 2018/3/21 10:41 */ -public abstract class BaseItemProvider { +public abstract class BaseItemProvider { public Context mContext; public List mData; - /** - * - * @return - */ + //子类须重写该方法返回viewType + //Rewrite this method to return viewType public abstract int viewType(); - /** - * - * @return - */ + //子类须重写该方法返回layout + //Rewrite this method to return layout public abstract int layout(); public abstract void convert(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;}; } 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/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 2ce704d08..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; /** @@ -17,10 +16,11 @@ public class ProviderDelegate { public void registerProvider(BaseItemProvider provider){ if (provider == null){ - throw new ItemProviderAnnotationException("ItemProviderTag not def layout"); + throw new ItemProviderException("ItemProvider can not be null"); } int viewType = provider.viewType(); + if (mItemProviders.get(viewType) == null){ mItemProviders.put(viewType,provider); }