From 8853f3e8f4abbfde9f1dd90f001521e96b04f150 Mon Sep 17 00:00:00 2001 From: Allen Date: Wed, 11 Apr 2018 16:10:27 +0800 Subject: [PATCH 1/3] 1.refactor multipleItemRvAdapter 2. remove multipleItemRvAdapter clickListener --- .../MultipleItemRvAdapterUseActivity.java | 24 +++++++++++--- .../adapter/DemoMultipleItemRvAdapter.java | 10 +++--- .../adapter/provider/ImgItemProvider.java | 28 +++++++--------- .../adapter/provider/TextImgItemProvider.java | 33 ++++++++----------- .../adapter/provider/TextItemProvider.java | 22 ++++++------- 5 files changed, 61 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java index 81c324ea7..816b8cc57 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java @@ -3,6 +3,9 @@ import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.View; +import android.widget.Toast; import com.chad.baserecyclerviewadapterhelper.adapter.DemoMultipleItemRvAdapter; import com.chad.baserecyclerviewadapterhelper.base.BaseActivity; @@ -44,16 +47,29 @@ protected void onCreate(Bundle savedInstanceState) { @Override public int getSpanSize(GridLayoutManager gridLayoutManager, int position) { int type = mData.get(position).type; - if (type == NormalMultipleEntity.SINGLE_TEXT){ + if (type == NormalMultipleEntity.SINGLE_TEXT) { return MultipleItem.TEXT_SPAN_SIZE; - }else if (type == NormalMultipleEntity.SINGLE_IMG){ + } else if (type == NormalMultipleEntity.SINGLE_IMG) { return MultipleItem.IMG_SPAN_SIZE; - }else{ + } else { return MultipleItem.IMG_TEXT_SPAN_SIZE; } } }); - + multipleItemAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { + @Override + public void onItemClick(BaseQuickAdapter adapter, View view, int position) { + Log.d(TAG, "onItemClick: "); + Toast.makeText(MultipleItemRvAdapterUseActivity.this, "onItemClick" + position, Toast.LENGTH_SHORT).show(); + } + }); + multipleItemAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { + @Override + public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { + Log.d(TAG, "onItemClick: "); + Toast.makeText(MultipleItemRvAdapterUseActivity.this, "onItemChildClick" + view.getId(), Toast.LENGTH_SHORT).show(); + } + }); mRecyclerView.setAdapter(multipleItemAdapter); } } diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DemoMultipleItemRvAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DemoMultipleItemRvAdapter.java index 966aac94f..40b0e1bdd 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DemoMultipleItemRvAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/DemoMultipleItemRvAdapter.java @@ -12,13 +12,13 @@ import java.util.List; /** - * https://github.com/chaychan * @author ChayChan + * modify by AllenCoder 2018/04/11 * @description: MultipleItemRvAdapter demo * @date 2018/3/30 11:28 */ -public class DemoMultipleItemRvAdapter extends MultipleItemRvAdapter { +public class DemoMultipleItemRvAdapter extends MultipleItemRvAdapter { public static final int TYPE_TEXT = 100; public static final int TYPE_IMG = 200; @@ -45,11 +45,11 @@ protected int getViewType(NormalMultipleEntity entity) { //根据实体类判断并返回对应的viewType,具体判断逻辑因业务不同,这里这是简单通过判断type属性 //According to the entity class to determine and return the corresponding viewType, //the specific judgment logic is different because of the business, here is simply by judging the type attribute - if (entity.type == NormalMultipleEntity.SINGLE_TEXT){ + if (entity.type == NormalMultipleEntity.SINGLE_TEXT) { return TYPE_TEXT; - }else if (entity.type == NormalMultipleEntity.SINGLE_IMG){ + } else if (entity.type == NormalMultipleEntity.SINGLE_IMG) { return TYPE_IMG; - }else if (entity.type == NormalMultipleEntity.TEXT_IMG){ + } else if (entity.type == NormalMultipleEntity.TEXT_IMG) { return TYPE_TEXT_IMG; } return 0; 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..e56ded91a 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 @@ -17,29 +17,25 @@ * @date 2018/3/30 11:39 */ -@ItemProviderTag( - viewType = DemoMultipleItemRvAdapter.TYPE_IMG, - layout = R.layout.item_image_view -) -public class ImgItemProvider extends BaseItemProvider { +public class ImgItemProvider extends BaseItemProvider { @Override - public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { - if (position % 2 == 0) { - helper.setImageResource(R.id.iv, R.mipmap.animation_img1); - }else{ - helper.setImageResource(R.id.iv, R.mipmap.animation_img2); - } + public int viewType() { + return DemoMultipleItemRvAdapter.TYPE_IMG; } @Override - public void onClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { - Toast.makeText(mContext, "click", Toast.LENGTH_SHORT).show(); + public int layout() { + return R.layout.item_image_view; } @Override - public boolean onLongClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { - Toast.makeText(mContext, "longClick", Toast.LENGTH_SHORT).show(); - return true; + public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { + if (position % 2 == 0) { + helper.setImageResource(R.id.iv, R.mipmap.animation_img1); + } else { + helper.setImageResource(R.id.iv, R.mipmap.animation_img2); + } + helper.addOnClickListener(R.id.iv); } } 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..1f70bed52 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,45 +1,40 @@ 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; 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 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 { +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); 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 8ac0a8810..d1e91ee97 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 @@ -11,30 +11,28 @@ /** * 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 { +public class TextItemProvider extends BaseItemProvider { @Override - public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { - helper.setText(R.id.tv, data.content); + public int viewType() { + return DemoMultipleItemRvAdapter.TYPE_TEXT; } @Override - public void onClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { - Toast.makeText(mContext, "click", Toast.LENGTH_SHORT).show(); + public int layout() { + return R.layout.item_text_view; } @Override - public boolean onLongClick(BaseViewHolder helper, NormalMultipleEntity data, int position) { - Toast.makeText(mContext, "longClick", Toast.LENGTH_SHORT).show(); - return true; + public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) { + helper.setText(R.id.tv, data.content); + helper.addOnClickListener(R.id.tv); } + } From 9b086ba9ed2552eba03e7819f87cda4f91a971e5 Mon Sep 17 00:00:00 2001 From: Allen Date: Wed, 11 Apr 2018 16:11:37 +0800 Subject: [PATCH 2/3] 1.Deprecated interface ItemProvideTag 2. Replace reflections with native methods --- .../adapter/base/MultipleItemRvAdapter.java | 33 +++---------------- .../base/annotation/ItemProviderTag.java | 3 ++ .../base/provider/BaseItemProvider.java | 18 +++++++--- .../adapter/base/util/ProviderDelegate.java | 5 ++- 4 files changed, 23 insertions(+), 36 deletions(-) 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..856f0960f 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 @@ -13,14 +13,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; @@ -49,12 +49,9 @@ protected int getItemType(T t) { 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); - getMultiTypeDelegate().registerItemType(key, tag.layout()); + getMultiTypeDelegate().registerItemType(key, provider.layout()); } } @@ -66,30 +63,8 @@ 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) { - View itemView = helper.itemView; - - 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); - } - }); } } 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..4ffe2356c 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 @@ -7,6 +7,7 @@ /** * https://github.com/chaychan + * * @author ChayChan * @description: ItemProvider's annotation * @date 2018/3/21 10:48 @@ -14,7 +15,9 @@ @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 c045eb1eb..a267b331d 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,19 +8,29 @@ /** * 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; - public abstract void convert(V helper, T data, int position); + /** + * + * @return + */ + public abstract int viewType(); + + /** + * + * @return + */ + public abstract int layout(); - public abstract void onClick(V helper, T data, int position); + public abstract void convert(V helper, T data, int position); - public abstract boolean onLongClick(V helper, T data, int position); } 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..2ce704d08 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 @@ -16,12 +16,11 @@ public class ProviderDelegate { private SparseArray mItemProviders = new SparseArray<>(); public void registerProvider(BaseItemProvider provider){ - ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class); - if (tag == null){ + if (provider == null){ throw new ItemProviderAnnotationException("ItemProviderTag not def layout"); } - int viewType = tag.viewType(); + int viewType = provider.viewType(); if (mItemProviders.get(viewType) == null){ mItemProviders.put(viewType,provider); } From 77f0dab5a89d050a6a1e6347ae9b2af659c32838 Mon Sep 17 00:00:00 2001 From: Allen Date: Thu, 12 Apr 2018 10:19:08 +0800 Subject: [PATCH 3/3] Merge branch 'master' of https://github.com/CymChad/BaseRecyclerViewAdapterHelper # Conflicts: # app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/ImgItemProvider.java # app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextImgItemProvider.java # app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java # library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java # library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java # library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java --- .../MultipleItemRvAdapterUseActivity.java | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java index 816b8cc57..099522b98 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/MultipleItemRvAdapterUseActivity.java @@ -17,7 +17,6 @@ import java.util.List; /** - * https://github.com/chaychan * * @author ChayChan * @description: MultipleItemRvAdapter's usage @@ -56,20 +55,43 @@ public int getSpanSize(GridLayoutManager gridLayoutManager, int position) { } } }); - multipleItemAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { - @Override - public void onItemClick(BaseQuickAdapter adapter, View view, int position) { - Log.d(TAG, "onItemClick: "); - Toast.makeText(MultipleItemRvAdapterUseActivity.this, "onItemClick" + position, Toast.LENGTH_SHORT).show(); - } - }); - multipleItemAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { + +/** + * The click event is distributed to the BaseItemProvider and can be overridden. + * if you need register itemchild click longClick + * you need to use https://github.com/CymChad/BaseRecyclerViewAdapterHelper/wiki/Add-OnItemClickLister#use-it-item-child-long-click + */ + /* @Override + protected void convert(BaseViewHolder helper, Status item) { + helper.setText(R.id.tweetName, item.getUserName()) + .setText(R.id.tweetText, item.getText()) + .setText(R.id.tweetDate, item.getCreatedAt()) + .setVisible(R.id.tweetRT, item.isRetweet()) + .addOnLongClickListener(R.id.tweetText) + .linkify(R.id.tweetText); + + } + adapter.setOnItemChildLongClickListener(new BaseQuickAdapter.OnItemChildLongClickListener() { @Override - public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { - Log.d(TAG, "onItemClick: "); - Toast.makeText(MultipleItemRvAdapterUseActivity.this, "onItemChildClick" + view.getId(), Toast.LENGTH_SHORT).show(); + public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) { + Log.d(TAG, "onItemChildLongClick: "); + Toast.makeText(ItemClickActivity.this, "onItemChildLongClick" + position, Toast.LENGTH_SHORT).show(); } - }); + });*/ +// multipleItemAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { +// @Override +// public void onItemClick(BaseQuickAdapter adapter, View view, int position) { +// Log.d(TAG, "onItemClick: "); +// Toast.makeText(MultipleItemRvAdapterUseActivity.this, "onItemClick" + position, Toast.LENGTH_SHORT).show(); +// } +// }); +// multipleItemAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { +// @Override +// public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { +// Log.d(TAG, "onItemClick: "); +// Toast.makeText(MultipleItemRvAdapterUseActivity.this, "onItemChildClick" + view.getId(), Toast.LENGTH_SHORT).show(); +// } +// }); mRecyclerView.setAdapter(multipleItemAdapter); } }