Skip to content

Commit c40b8c9

Browse files
committed
BaseItemProvider新增支持注解或重写方法返回viewType和layout的id;修复itemProvider覆盖onItemClickListener回调的问题,如有设置onItemClickListener则不回调到itemProvider的onClick方法中,长按事件如同
1 parent d7e51f3 commit c40b8c9

File tree

5 files changed

+75
-35
lines changed

5 files changed

+75
-35
lines changed

app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/provider/TextItemProvider.java

+17
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,23 @@
2222
)
2323
public class TextItemProvider extends BaseItemProvider<NormalMultipleEntity,BaseViewHolder> {
2424

25+
/*
26+
使用注解返回对应的viewType和layout,或者重写getViewType()和getLayout()
27+
Use annotations to return the corresponding viewType and layout, or override getViewType() and getLayout()
28+
29+
@Override
30+
public int getViewType() {
31+
return DemoMultipleItemRvAdapter.TYPE_TEXT;
32+
}
33+
*/
34+
35+
/*
36+
@Override
37+
public int getLayout() {
38+
return R.layout.item_text_view;
39+
}
40+
*/
41+
2542
@Override
2643
public void convert(BaseViewHolder helper, NormalMultipleEntity data, int position) {
2744
helper.setText(R.id.tv, data.content);

library/src/main/java/com/chad/library/adapter/base/MultipleItemRvAdapter.java

+35-13
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@ protected int getItemType(T t) {
5454
provider.mData = mData;
5555

5656
ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class);
57-
getMultiTypeDelegate().registerItemType(key, tag.layout());
57+
if (tag == null){
58+
getMultiTypeDelegate().registerItemType(key, provider.getLayout());
59+
}else{
60+
getMultiTypeDelegate().registerItemType(key, tag.layout());
61+
}
62+
5863
}
5964
}
6065

@@ -76,20 +81,37 @@ protected void convert(V helper, T item) {
7681
}
7782

7883
private void bindClick(final V helper, final T item, final int position, final BaseItemProvider provider) {
84+
OnItemClickListener clickListener = getOnItemClickListener();
85+
OnItemLongClickListener longClickListener = getOnItemLongClickListener();
86+
87+
if (clickListener != null && longClickListener != null){
88+
//如果已经设置了子条目点击监听和子条目长按监听
89+
// If you have set up a sub-entry click monitor and sub-entries long press listen
90+
return;
91+
}
92+
7993
View itemView = helper.itemView;
8094

81-
itemView.setOnClickListener(new View.OnClickListener() {
82-
@Override
83-
public void onClick(View v) {
84-
provider.onClick(helper, item, position);
85-
}
86-
});
95+
if (clickListener == null){
96+
//如果没有设置点击监听,则回调给itemProvider
97+
//Callback to itemProvider if no click listener is set
98+
itemView.setOnClickListener(new View.OnClickListener() {
99+
@Override
100+
public void onClick(View v) {
101+
provider.onClick(helper, item, position);
102+
}
103+
});
104+
}
87105

88-
itemView.setOnLongClickListener(new View.OnLongClickListener() {
89-
@Override
90-
public boolean onLongClick(View v) {
91-
return provider.onLongClick(helper, item, position);
92-
}
93-
});
106+
if (longClickListener == null){
107+
//如果没有设置长按监听,则回调给itemProvider
108+
// If you do not set a long press listener, callback to the itemProvider
109+
itemView.setOnLongClickListener(new View.OnLongClickListener() {
110+
@Override
111+
public boolean onLongClick(View v) {
112+
return provider.onLongClick(helper, item, position);
113+
}
114+
});
115+
}
94116
}
95117
}

library/src/main/java/com/chad/library/adapter/base/provider/BaseItemProvider.java

+19-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,23 @@ public abstract class BaseItemProvider<T,V extends BaseViewHolder> {
2020

2121
public abstract void convert(V helper, T data, int position);
2222

23-
public abstract void onClick(V helper, T data, int position);
24-
25-
public abstract boolean onLongClick(V helper, T data, int position);
23+
//子类若想实现条目点击事件则重写该方法
24+
//Subclasses override this method if you want to implement an item click event
25+
public void onClick(V helper, T data, int position){};
26+
27+
//子类若想实现条目长按事件则重写该方法
28+
//Subclasses override this method if you want to implement an item long press event
29+
public boolean onLongClick(V helper, T data, int position){return false;};
30+
31+
//如果没有使用注解返回layout则重写该方法
32+
//Rewrite this method if you did not use annotations to return layout
33+
public int getLayout(){
34+
return 0;
35+
}
36+
37+
//如果没有使用注解返回viewType则重写该方法
38+
//Rewrite this method if you did not use annotations to return viewType
39+
public int getViewType(){
40+
return 0;
41+
}
2642
}

library/src/main/java/com/chad/library/adapter/base/util/ItemProviderAnnotationException.java

-17
This file was deleted.

library/src/main/java/com/chad/library/adapter/base/util/ProviderDelegate.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ public class ProviderDelegate {
1717

1818
public void registerProvider(BaseItemProvider provider){
1919
ItemProviderTag tag = provider.getClass().getAnnotation(ItemProviderTag.class);
20+
int viewType;
2021
if (tag == null){
21-
throw new ItemProviderAnnotationException("ItemProviderTag not def layout");
22+
viewType = provider.getViewType();
23+
}else{
24+
viewType = tag.viewType();
2225
}
2326

24-
int viewType = tag.viewType();
2527
if (mItemProviders.get(viewType) == null){
2628
mItemProviders.put(viewType,provider);
2729
}

0 commit comments

Comments
 (0)