Skip to content

Commit 1017685

Browse files
committed
Deprecated interface ItemProvideTag;
Replace reflections with native method;
1 parent b85d6c7 commit 1017685

8 files changed

Lines changed: 80 additions & 34 deletions

File tree

app/src/main/java/com/chaychan/multiitemrvadapter/adapter/MessageListAdapter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.support.annotation.Nullable;
44

5+
import com.chad.library.adapter.base.BaseViewHolder;
56
import com.chaychan.adapter.MultipleItemRvAdapter;
67
import com.chaychan.multiitemrvadapter.adapter.provider.ImageMessageItemProvider;
78
import com.chaychan.multiitemrvadapter.adapter.provider.TextMessageItemProvider;
@@ -17,7 +18,7 @@
1718
* @date 2018/3/21 14:40
1819
*/
1920

20-
public class MessageListAdapter extends MultipleItemRvAdapter<Message> {
21+
public class MessageListAdapter extends MultipleItemRvAdapter<Message,BaseViewHolder> {
2122

2223
public static final int TYPE_TEXT = 0;
2324
public static final int TYPE_IMG = 1;

app/src/main/java/com/chaychan/multiitemrvadapter/adapter/provider/ImageMessageItemProvider.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,26 @@
66
import com.bumptech.glide.Glide;
77
import com.chad.library.adapter.base.BaseViewHolder;
88
import com.chaychan.adapter.BaseItemProvider;
9-
import com.chaychan.adapter.ItemProviderTag;
10-
import com.chaychan.multiitemrvadapter.model.ImageMessage;
119
import com.chaychan.multiitemrvadapter.R;
1210
import com.chaychan.multiitemrvadapter.adapter.MessageListAdapter;
11+
import com.chaychan.multiitemrvadapter.model.ImageMessage;
1312

1413
/**
1514
* @author ChayChan
1615
* @description 图片消息条目的provider
1716
* @date 2018/3/21 14:43
1817
*/
19-
@ItemProviderTag(
20-
viewType = MessageListAdapter.TYPE_IMG,
21-
layout = R.layout.item_image_message
22-
)
23-
public class ImageMessageItemProvider extends BaseItemProvider<ImageMessage> {
18+
public class ImageMessageItemProvider extends BaseItemProvider<ImageMessage,BaseViewHolder> {
19+
20+
@Override
21+
public int viewType() {
22+
return MessageListAdapter.TYPE_IMG;
23+
}
24+
25+
@Override
26+
public int layout() {
27+
return R.layout.item_image_message;
28+
}
2429

2530
@Override
2631
public void convert(BaseViewHolder helper, ImageMessage data, int position) {

app/src/main/java/com/chaychan/multiitemrvadapter/adapter/provider/TextMessageItemProvider.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,26 @@
44

55
import com.chad.library.adapter.base.BaseViewHolder;
66
import com.chaychan.adapter.BaseItemProvider;
7-
import com.chaychan.adapter.ItemProviderTag;
87
import com.chaychan.multiitemrvadapter.R;
9-
import com.chaychan.multiitemrvadapter.model.TextMessage;
108
import com.chaychan.multiitemrvadapter.adapter.MessageListAdapter;
9+
import com.chaychan.multiitemrvadapter.model.TextMessage;
1110

1211
/**
1312
* @author ChayChan
1413
* @description 文本消息条目的provider
1514
* @date 2018/3/21 14:43
1615
*/
17-
@ItemProviderTag(
18-
viewType = MessageListAdapter.TYPE_TEXT,
19-
layout = R.layout.item_text_message
20-
)
21-
public class TextMessageItemProvider extends BaseItemProvider<TextMessage> {
16+
public class TextMessageItemProvider extends BaseItemProvider<TextMessage,BaseViewHolder> {
17+
18+
@Override
19+
public int viewType() {
20+
return MessageListAdapter.TYPE_TEXT;
21+
}
22+
23+
@Override
24+
public int layout() {
25+
return R.layout.item_text_message;
26+
}
2227

2328
@Override
2429
public void convert(BaseViewHolder helper, TextMessage data, int position) {

library/src/main/java/com/chaychan/adapter/BaseItemProvider.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,32 @@
77
import java.util.List;
88

99
/**
10+
* https://github.com/chaychan
1011
* @author ChayChan
11-
* @description: 条目provider的基类
12+
* @description: The base class of ItemProvider
1213
* @date 2018/3/21 10:41
1314
*/
1415

15-
public abstract class BaseItemProvider<T> {
16+
public abstract class BaseItemProvider<T,V extends BaseViewHolder> {
1617

17-
protected Context mContext;
18-
protected List<T> mData;
18+
public Context mContext;
19+
public List<T> mData;
1920

20-
public abstract void convert(BaseViewHolder helper, T data, int position);
21+
//子类须重写该方法返回viewType
22+
//Rewrite this method to return viewType
23+
public abstract int viewType();
2124

22-
public abstract void onClick(BaseViewHolder helper,T data,int position);
25+
//子类须重写该方法返回layout
26+
//Rewrite this method to return layout
27+
public abstract int layout();
2328

24-
public abstract boolean onLongClick(BaseViewHolder helper,T data,int position);
29+
public abstract void convert(V helper, T data, int position);
30+
31+
//子类若想实现条目点击事件则重写该方法
32+
//Subclasses override this method if you want to implement an item click event
33+
public void onClick(V helper, T data, int position){};
34+
35+
//子类若想实现条目长按事件则重写该方法
36+
//Subclasses override this method if you want to implement an item long press event
37+
public boolean onLongClick(V helper, T data, int position){return false;};
2538
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.chaychan.adapter;
2+
3+
/**
4+
* @author ChayChan
5+
* @description: ItemProviderException
6+
* @date 2018/4/12 9:10
7+
*/
8+
9+
public class ItemProviderException extends NullPointerException {
10+
11+
public ItemProviderException(String message) {
12+
super(message);
13+
}
14+
15+
}

library/src/main/java/com/chaychan/adapter/ItemProviderTag.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
@Target({ElementType.TYPE})
1515
@Retention(RetentionPolicy.RUNTIME)
16+
@Deprecated
1617
public @interface ItemProviderTag {
1718
int viewType();
1819
int layout();

library/src/main/java/com/chaychan/adapter/MultipleItemRvAdapter.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
import java.util.List;
1212

1313
/**
14+
* https://github.com/chaychan
1415
* @author ChayChan
15-
* @description: 封装多条目adapter
16+
* @description:
17+
* When there are multiple entries, avoid too much business logic in convert(),Put the logic of each item in the corresponding ItemProvider
18+
* 当有多种条目的时候,避免在convert()中做太多的业务逻辑,把逻辑放在对应的ItemProvider中
1619
* @date 2018/3/21 9:55
1720
*/
1821

19-
public abstract class MultipleItemRvAdapter<T> extends BaseQuickAdapter<T, BaseViewHolder> {
22+
public abstract class MultipleItemRvAdapter<T,V extends BaseViewHolder> extends BaseQuickAdapter<T, V> {
2023

2124
private SparseArray<BaseItemProvider> mItemProviders;
2225
protected ProviderDelegate mProviderDelegate;
@@ -27,6 +30,7 @@ public MultipleItemRvAdapter(@Nullable List<T> data) {
2730

2831
/**
2932
* 用于adapter构造函数完成参数的赋值后调用
33+
* Called after the assignment of the argument to the adapter constructor
3034
*/
3135
public void finishInitialize() {
3236
mProviderDelegate = new ProviderDelegate();
@@ -42,14 +46,12 @@ protected int getItemType(T t) {
4246
registerItemProvider();
4347

4448
mItemProviders = mProviderDelegate.getItemProviders();
49+
4550
for (int i = 0; i < mItemProviders.size(); i++) {
4651
int key = mItemProviders.keyAt(i);
47-
4852
BaseItemProvider provider = mItemProviders.get(key);
4953
provider.mData = mData;
50-
51-
ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class);
52-
getMultiTypeDelegate().registerItemType(key, tag.layout());
54+
getMultiTypeDelegate().registerItemType(key, provider.layout());
5355
}
5456
}
5557

@@ -58,7 +60,7 @@ protected int getItemType(T t) {
5860
public abstract void registerItemProvider();
5961

6062
@Override
61-
protected void convert(BaseViewHolder helper, T item) {
63+
protected void convert(V helper, T item) {
6264
int itemViewType = helper.getItemViewType();
6365
BaseItemProvider provider = mItemProviders.get(itemViewType);
6466

@@ -70,19 +72,21 @@ protected void convert(BaseViewHolder helper, T item) {
7072
bindClick(helper, item, position, provider);
7173
}
7274

73-
private void bindClick(final BaseViewHolder helper, final T item, final int position, final BaseItemProvider provider) {
75+
private void bindClick(final V helper, final T item, final int position, final BaseItemProvider provider) {
7476
OnItemClickListener clickListener = getOnItemClickListener();
7577
OnItemLongClickListener longClickListener = getOnItemLongClickListener();
7678

7779
if (clickListener != null && longClickListener != null){
7880
//如果已经设置了子条目点击监听和子条目长按监听
81+
// If you have set up a sub-entry click monitor and sub-entries long press listen
7982
return;
8083
}
8184

8285
View itemView = helper.itemView;
8386

8487
if (clickListener == null){
8588
//如果没有设置点击监听,则回调给itemProvider
89+
//Callback to itemProvider if no click listener is set
8690
itemView.setOnClickListener(new View.OnClickListener() {
8791
@Override
8892
public void onClick(View v) {
@@ -93,6 +97,7 @@ public void onClick(View v) {
9397

9498
if (longClickListener == null){
9599
//如果没有设置长按监听,则回调给itemProvider
100+
// If you do not set a long press listener, callback to the itemProvider
96101
itemView.setOnLongClickListener(new View.OnLongClickListener() {
97102
@Override
98103
public boolean onLongClick(View v) {

library/src/main/java/com/chaychan/adapter/ProviderDelegate.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.util.SparseArray;
44

55
/**
6+
* https://github.com/chaychan
67
* @author ChayChan
78
* @date 2018/3/21 11:04
89
*/
@@ -12,12 +13,12 @@ public class ProviderDelegate {
1213
private SparseArray<BaseItemProvider> mItemProviders = new SparseArray<>();
1314

1415
public void registerProvider(BaseItemProvider provider){
15-
ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class);
16-
if (tag == null){
17-
throw new RuntimeException("Can not find the annotation: 'ItemProviderTag'");
16+
if (provider == null){
17+
throw new ItemProviderException("ItemProvider can not be null");
1818
}
1919

20-
int viewType = tag.viewType();
20+
int viewType = provider.viewType();
21+
2122
if (mItemProviders.get(viewType) == null){
2223
mItemProviders.put(viewType,provider);
2324
}

0 commit comments

Comments
 (0)